求助如何利用uart里的数据改变方波

2019-03-24 11:24发布

本帖最后由 helloboy123 于 2014-6-28 23:09 编辑

大家好
我用的是 msp430 g25553  我现在要写一个机械臂的控制程序

p1.1 p1.2  uart接口
p1.6 计时器A 输出一路方波
p2.1 p2.4 计时器B 输出两路占空比不同的方波
我想利用从uart里接受到的数据,让他们来控制方波的占空比(蓝牙模块收到1,则TA1CCR1=222,收到2,则TA1CCR1=111 ),一开始调试的时候是可以的,但是后来不知道为什么我怎么传都不行了
我怀疑是程序本身也有问题
求各位大哥们指教
程序如下:

#include "msp430g2553.h"
#define MCU_CLOCK 1000000
#define PWM_FREQUENCY 900// 180时候为200hz
#define SERVO_STEPS 110   // 设置一度步进
#define SERVO_MIN 900     // 最小值0°
#define SERVO_MAX 2100    // 大概转动180°
unsigned char c;
unsigned int PWM_P =(MCU_CLOCK / PWM_FREQUENCY);// PWM 的频率

void main (void)
{
unsigned int servo_stepval, servo_stepnow;
unsigned int servo_lut[200];
unsigned int i;

// 计算步长值和当前步骤,默认定义为最小
servo_stepval =((SERVO_MAX - SERVO_MIN)/ SERVO_STEPS ); //步幅间隔10.9。
servo_stepnow = SERVO_MIN;

// 赋值LUT
for(i =0;i<200; i++)
{
servo_stepnow += servo_stepval;
servo_lut= servo_stepnow;
}

// 设置PWM波的输出
WDTCTL = WDTPW + WDTHOLD;       // 关闭看门狗
TACCR0 = PWM_P;                  // ta0PWM 频率
TA1CCR0 = PWM_P;                  // ta1PWM 频率
TACCR1 =  servo_lut[0];          // TA0 PWM 占空比设置
TA1CCR1 = servo_lut[0];          // TA1 PWM 占空比设置
TA1CCR2 = servo_lut[0];


//蓝牙模块
if (CALBC1_1MHZ==0xFF)                                        // If calibration constant erased
  {
    while(1);                               // do not load, trap CPU!!
  }
  DCOCTL = 0;                               // Select lowest DCOx and MODx settings
  BCSCTL1 = CALBC1_1MHZ;                    // Set DCO
  DCOCTL = CALDCO_1MHZ;
  P1SEL = BIT1 + BIT2 ;               // P1.1 = RXD, P1.2=TXD
  P1SEL2 = BIT1 + BIT2 ;                    // P1.1 = RXD, P1.2=TXD

  P1SEL |= BIT6;
  P1DIR |= BIT6;//1.6
  P2DIR |= BIT1;/*管脚p2.1,p2.4由TA1控制输出*/
  P2SEL |= BIT1;
  P2DIR |= BIT4;
  P2SEL |= BIT4;

  TACCTL1  = OUTMOD_7;              /*设置Ta0*/
  TA1CCTL1 = OUTMOD_7;
  TA1CCTL2 = OUTMOD_7;                                /*设置ta1*/
  TACTL = TASSEL_2 + MC_1;        // SMCLK, upmode
  TA1CTL = TASSEL_2 + MC_1;        // SMCLK, upmode

  UCA0CTL1 |= UCSSEL_2;                     // SMCLK
  UCA0BR0 = 104;                            // 1MHz 9600
  UCA0BR1 = 0;                              // 1MHz 9600
  UCA0MCTL = UCBRS0;                        // Modulation UCBRSx = 1
  UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
  IE2 |= UCA0RXIE;                          // Enable USCI_A0 RX interrupt

  
  //蓝牙模块
  __bis_SR_register(LPM0_bits + GIE);       // Enter LPM0, interrupts enabled
}
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{

          while(!(IFG2&UCA0TXIFG));                // USCI_A0 TX buffer ready?
          UCA0TXBUF = UCA0RXBUF;
          c = UCA0RXBUF;
          if(UCA0RXBUF=='1')
           {
                   TA1CCR1=222;
           }
           if(UCA0RXBUF=='2')
           {
                   TA1CCR1=111;
           }
}

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
helloboy123
2019-03-24 21:10
 精彩回答 2  元偷偷看……0人看过

一周热门 更多>

相关问题

    相关文章