这是我的程序请大神帮我看一下是不是思路错了???TBCCR1,,TBCCR2添加watch经过串口有数据传过来但是不能控制舵机动而且用示波器测试p4.1没有波形。。。。是不是思路错了大佬们??
#include "msp430x14x.h"
#include "Slaveopera
tion.h"
void UART0_Init();
void TimerB_Init();
void Port_Init();
void Init_Clock(void);
void Send0_Byte(unsigned char data);
void Send0_Str(unsigned char *s);
unsigned char SerialpoSend[6]={0xAA, 0x11,0x22,0x33,0x44,0xBB};
unsigned char SerialportRev[17],SerialportRevCount,SerialportRevFlag;
unsigned char data,jj,adc_flag,countsend;
int main( void )
{
WDTCTL = WDTPW + WDTHOLD;
SerialportRevCount=0;
UART0_Init();
Port_Init();
TimerB_Init();
Clock_Init();
Close_LED();
while(1);
}
//***********************************************************************
// MSP430IO口初始化
//***********************************************************************
void Port_Init()
{
LED8SEL = 0x00; //设置IO口为普通I/O模式,此句可省
LED8DIR = 0xFF; //设置IO口方向为输出
LED8PORT = 0xFF; //P2口初始设置为FF
DATASEL = 0x00; //设置IO口为普通I/O模式,此句可省
DATADIR = 0xFF; //设置IO口方向为输出
DATAPORT = 0xFF; //P4口初始设置为FF
CTRSEL = 0x00; //设置IO口为普通I/O模式,此句可省
CTRDIR |= BIT3 + BIT4; //设置IO口方向为输出,控制口在P63,P64
CTRPORT = 0xFF; //P6口初始设置为FF
}
//*************************************************************************
// MSP430串口0初始化
//*************************************************************************
void UART0_Init()
{
unsigned char j;
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
BCSCTL1&=~XT2OFF;
do{
IFG1&=~OFIFG; //消除振荡器失效标志
for(j=0XFF;j>0;j--);
}
while((IFG1&OFIFG));
BCSCTL2|=SELM_2;
P3DIR|=BIT4;
P3DIR&=~BIT5;
P3SEL|=BIT4+BIT5;
ME1 |= UTXE0 + URXE0; // 使能USART0收发
U0CTL |= CHAR; // 8-bit 数据,一位停止位
U0TCTL |= SSEL0; // 选择时钟,UCLK = ACLK,32768
U0BR0 = 0x03; // 32k/9600
U0BR1 = 0x00; //波特率9600
U0MCTL = 0x4a; // Modulation
U0CTL &= ~SWRST; // 初始化UART0状态机,一般要设置好串口之后才复位
IE1 |= URXIE0;
_EINT();
}
//*************************************************************************
// 处理来自串口0的接收中断
//*************************************************************************
#pragma vector=UART0RX_VECTOR
__interrupt void UART0_RX_ISR(void)
{
SerialportRev[SerialportRevCount]=U0RXBUF;//SerialportRev[11],SerialportRevCount,SerialportRevFlag;
SerialportRevCount++;
if(SerialportRevCount==17)
{SerialportRevCount=0;
for(jj=0;jj<12;jj++)
{
if(( SerialportRev[jj]==0xAA)&&( SerialportRev[jj+5]==0xBB))
{
TBCCR1=SerialportRev[jj+1]*16+SerialportRev[jj+2];
TBCCR2=SerialportRev[jj+3]*16+SerialportRev[jj+4];
}
}
data=U0RXBUF; //接收到的数据存起来
Send0_Byte(data); //将接收到的数据再发送出去
}
}
//*************************************************************************
// 串口0发送一个数据函数
//*************************************************************************
void Send0_Byte(unsigned char data)
{
while(!(IFG1&UTXIFG0)); //发送寄存器空的时候发送数据
U0TXBUF=data;
}
//*************************************************************************
// 串口0发送字符串函数
//*************************************************************************
void Send0_Str(unsigned char *s)
{
while(*s != ' ')
{
while(!(IFG1&UTXIFG0));
U0TXBUF = *s++;
}
}
//*************************************************************************
// 定时器B,用于实现PWM脉冲输出
//*************************************************************************
void TimerB_Init()
{WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
P4DIR |= 0x7e; // P4.1 - P4.6 output
P4SEL |= 0x7e; // P4.1 -P4.6 TB1/2 options
TBCCR0 =20000; // PWM Period/20
TBCCTL1 = OUTMOD_7; // CCR1 toggle/set
TBCCR1 = SerialportRev[jj+1]*16+SerialportRev[jj+2]; // p4.1控制0号舵机(500-2500 90~~-90)
TBCCTL2 = OUTMOD_7; // CCR2 toggle/set
TBCCR2 = SerialportRev[jj+3]*16+SerialportRev[jj+4]; // p4.2控制2号舵机只能到(1000-2500 45~~-90)
TBCTL = TBSSEL_2 + MC_1+ID_3+TBCLR; // SMCLK, 8分频 增计数模式
}
我又把TBCCRO改小了然后就调出50HZ 的频率了,波形也有了,但是电机还是不动有点纳闷了~~在调试调试吧
一周热门 更多>