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?