Controlando MSP430 PWM con una computadora portátil

3

He escrito un código que toma un número de dos dígitos de la computadora portátil y cambia el ciclo de trabajo de PWM a ese número. Es parte de un requisito mayor en el que necesito controlar la velocidad del motor sobre UART.

#include "io430g2553.h"
#include <stdint.h>


void PWM(uint8_t duty_cycle);
void PWM_Config();


int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
   WDTCTL = WDTPW + WDTHOLD;
  BCSCTL1 = CALBC1_1MHZ;                  // Run at 1 MHz
  DCOCTL = CALDCO_1MHZ;                   // Run at 1 MHz

   PWM_Config();
   PWM(5);
   __delay_cycles(5000000);
   PWM(15);
    __delay_cycles(5000000);
   PWM(25);
   __delay_cycles(5000000);
   PWM(50);
    __delay_cycles(5000000);
    PWM(25);
    __delay_cycles(5000000);
     PWM(15);
    __delay_cycles(5000000);
     PWM(5);
   while(1)
   {}


}


void PWM_Config()
{
  P1OUT &= 0x00; // Clearing P1OUT 
  P1SEL |= BIT6 ;
  P1SEL2 &= ~BIT6 ;
  P1DIR |= BIT6; // Configuring P1.6 as Output

}

void PWM(uint8_t duty_cycle)
{
 TA0CTL =0;
 TA0CTL |= TACLR; 
 TA0CCR1 |= (duty_cycle*100);
 TA0CCR0 |= 10000; 
 TA0CTL |= TASSEL_2 + MC_1 + ID_0;// Register TA0CTL -> SMCLK/8, Up mode
 TA0CCTL1 |= OUTMOD_7 ;//Set/Reset Mode
 TA0CCTL0 &= ~CCIE; // Interrupt Disabled
}

Edité Mi pregunta sobre el comentario recibido:

El problema con la función PWM (uint8_t duty_cycle) anulada es que la primera vez que genera el PWM correcto en P1.6, a continuación, si se le asigna un valor, cambia PWM a ese DC, pero no puedo volver a bajar. DC.

las funciones PWM de fisrt 2 en el código cambian para corregir el ciclo de trabajo PWM (5), PWM (15) y el resto de los valores de PWM no producen el ciclo de trabajo deseado.

No puedo solucionar dónde me equivoco, ¿puedo ayudarlo?

    
pregunta Gaurav K

1 respuesta

8

Cambia el:

TA0CCR1 |= (duty_cycle*100);

A una tarea simple:

TA0CCR1 = (duty_cycle*100);

De lo contrario, estás ORENTANDO el valor anterior con el nuevo, eventualmente llenándolo con uno. Por eso no puede volver a un ciclo de trabajo inferior.

Por cierto, no sé si su MSP430 tiene un multiplicador de hardware, pero si no lo hace, debe evitar las multiplicaciones directas siempre que sea posible, ya que pueden tardar algunos ciclos en ejecutarse. En su lugar, use potencias de 2 (como 128), porque solo necesita cambiar el valor a la izquierda.

    
respondido por el apalopohapa

Lea otras preguntas en las etiquetas