本帖最后由 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;
}
}
此帖出自
小平头技术问答
一周热门 更多>