打印

发送字符串产生PWM控制舵机的问题

[复制链接]
853|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Lewisnx|  楼主 | 2018-3-23 18:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是我的程序请大神帮我看一下是不是思路错了???TBCCR1,,TBCCR2添加watch经过串口有数据传过来但是不能控制舵机动而且用示波器测试p4.1没有波形。。。。是不是思路错了大佬们??
#include "msp430x14x.h"
#include "Slaveoperation.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 != '\0')
    {
       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分频 增计数模式
}

相关帖子

沙发
CCompton| | 2018-3-23 18:22 | 只看该作者
void TimerB_Init()
{TBCTL |= TBSSEL_2 +ID_3+TBCLR; // SMCLK, 8分频
  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 |=  MC_1; // SMCLK, 8分频 增计数模式
}

使用特权

评论回复
板凳
Mattheww| | 2018-3-23 18:49 | 只看该作者
发送AA 3E 08 3E 08 BB在IAR上watch 都是1000~~但是无法产生脉冲

使用特权

评论回复
地板
Mattheww| | 2018-3-23 18:55 | 只看该作者
你在定时器里最后是TBCTL = TBSSEL_2 + MC_1+ID_3+TBCLR; // SMCLK, 8分频 增计数模式

使用特权

评论回复
5
Erichk| | 2018-3-23 19:06 | 只看该作者
TBCLR是清除了定时器设置,相当于前面设置的清除掉了,你在进入定时器刚开始清除一下,最后开启定时器的时候不要加上TBCLR试一下,不知道这样之后对不对

使用特权

评论回复
6
Thorald| | 2018-3-23 19:24 | 只看该作者
首先非常感谢你能帮忙,但是我试了还是不行 我把主函数里面的Clock_Init()和Close_LED() 屏蔽了之后有波形但不是我要的50HZ还是无法控制舵机0..

使用特权

评论回复
7
Bjorn| | 2018-3-23 19:30 | 只看该作者
输出电流太小,驱动不了电机的

使用特权

评论回复
8
10299823| | 2018-3-24 08:13 | 只看该作者
这个是有什么问题吗

使用特权

评论回复
9
jimmhu| | 2018-3-24 08:15 | 只看该作者
思路是对的。

使用特权

评论回复
10
lihuami| | 2018-3-24 08:17 | 只看该作者
串口接受的是字符串。

使用特权

评论回复
11
lihuami| | 2018-3-24 08:17 | 只看该作者
你要转换为整数类型。

使用特权

评论回复
12
jimmhu| | 2018-3-24 08:19 | 只看该作者
可能程序不能运行。

使用特权

评论回复
13
10299823| | 2018-3-24 08:19 | 只看该作者
串口接受吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

45

主题

380

帖子

0

粉丝