我依然坚持,任何一次自己的心有感触都要及时的记录下来,这样你的努力才是真正的努力。
这两天一直在用STM32调试CDS5516舵机,其实很简单,但是却花了将近两天的时间,过程之曲折我就不说了,先总结一下怎么用32调试CDS5516舵机吧!
首先,要明确,CDS5516舵机是一个可编程的数字舵机,要实现对他的控制,就要通过串口线,发一系列的指令包,通过应答来判断所发指令是否正确,由于是单线通信,所以必须要在发送完指令包之后立马转换为接收模式,采用STM32的话有两种方法,可以实现,1、将串口的TX和RX连接起来,通过使能发送使能和接收使能,来实现。2、利用单线的半双工模式通信,也就是只用TX线,在发送完之后,TX线被释放,可以接收(实际上就是内部将TX和RX线连接起来了)。(注意:在此进行单线测试的时候,若发送用的USART1那么接收中断不能再使用USART1的接收中断)
以上只是准备工作,然后就可以连接舵机进行调试了,在调试的时候,我用的STM32的USART1的TX口,TX口必须加上3.3V,4.7K左右的上拉电阻,才能保证发出的数据包的正确。而舵机的工作电压范围是6.8-14V,我用了11.3V的电池对舵机进行供电,当你拿到一个CDS5516的舵机的时候,你可能并不知道该舵机的ID号是多少,那么你就可以采用广播发送的模式,将ID号设置为已知,具体设置方法手册中有详细说明,
我在查阅资料的时候,见到有人问关于通信的波特率的问题,在默认情况下,CDS5516舵机的通信波特率应该是1MHZ,我也是试出来的,因为只有几个固定设置的比特率的值在设置后再掉电是不会消失的,而其他的掉电之后会消失,因此,在此推荐各位能试一试。在设置完ID号的时候,可以通过查看应答包来确定是否设置成功,该步骤很重要,因为如果这一步完成,那么你的调试基本可以算是完成了百分之99,,,所有的指令包,在手册里都能详细的查到,在此提醒一下各位,如果你是仿照手册中的某一个例子,改了ID号或者是其他的希望实现同样的功能,那么请你一定要记得修该最后的校验和该数值,楼主在一开始调试的时候,就没注意到这一点,照本宣科,结果浪费了很多时间。由于我对舵机的要求比较简单,只实现舵机能够按照我设定的角度进行旋转,因此没有在进行其他的测试,但是已经实现这些功能的话,其他的应该也是不成问题的。楼主使用的正点原子战舰的板子进行调试的,下面将两个主要的代码进行粘贴,供大家参考:
void Set_Num_1(void) //设置舵机的ID号为1
{
USART1->CR1 &= ~0x4;
USART1_Send_Char(0xFF);
USART1_Send_Char(0XFF);
USART1_Send_Char(0XFE);
USART1_Send_Char(0X04);
USART1_Send_Char(0X03);
USART1_Send_Char(0X03);
USART1_Send_Char(0X01);
USART1_Send_Char(0XF6);
USART1->CR1 |= 0x4;
delay_ms();
}
void Set_Num_Speed(u8 id,u32 arg) //设置舵机旋转的目标角度
{
static u8 i = ;
u8 sum = 0x00;
uint8_t dat[] = {0xFF,0xFF,,,0x03,0x1E,,,0xFF}; //定义一个数据包
dat[] = id; //设置ID号
dat[] = (arg*0x3FF/)&0xFF; //设置目标角度的低字节
dat[] = (arg*0x3FF/)>>; //设置目标角度的高字节
for(i=;i<;i++)
{
sum+=dat[i]; //计算校验和
}
dat[] = ~sum; for(i=;i<;i++)
{
USART1_Send_Char(dat[i]); //将数据包发出
}
}
以上两个函数基本算是舵机调试的主要函数了,希望能帮到各位。
*************************************************************
*************************************************************
*************************************************************
这两天的调试,让我想了很多,这样一个并不是很难的调试却花费了我两天的时间,而且还是在小伙伴@xkwy的帮助下(在此感谢xkwy,希望以后的某一天他能看到)其中的原因确实值得我深思。
1、面对一个新的东西,不知道该从何下手。。。或许这也是我最大的一个问题了,对于这次的调试,手头的资料只有一份技术手册,在刚开始调试的时候,自己就已经打起了退堂鼓,以前也是这样。无论是从最开始的准备工作,还是在之后的调试中,面对一个问题,心里就心烦意乱,把大量的时间和精力都花在了抱怨和一次次徒劳无功的测试上,没有想问题的根本处在哪里。其实看别人,才会发现,别人也是在这样的情况下,对照着手册, 一点点的进行。这一点自己确实做得还很不到位。
2、第二个最大的问题,就是”懒!“,在调试的过程当中,首先准备工作就没有做好,连接收应答包的准备工作都没有做好,那么又何谈区解决问题呢?除此之外,对于可能出现问题的地方,总是嫌麻烦,然后将问题规避掉,直接测试,期待最后的正确的结果,现在想想,这样的概率是有多么的低啊,把可能出问题的部分全都规避掉,然后对于不正确的结果又无可奈何,最后,只能让自己越加烦躁,看来,自己的心急气躁也不是没有原因的。
3、对于手册,总是不能认真的看,无论是面对什么样的新的问题,自己最希望的就是能从网上直接找到例程,然后看别人怎么弄,照葫芦画瓢,在这样的心里下,往往最可能的就是忽略了身边最有用的参考资料-技术手册。在以后的道路上,会面对各种各样的新的器件,问题,不可能都从网上找到资料,那么这时候,如果自己没有这种从手册出发,解决问题的能力,无疑自己未来的发展也就这样了。
4、基本功不够扎实,作为一个以嵌入式开发为目标的开发者来说,对于芯片硬件的了解太少了,甚至连最基本的底层程序也是”书到用时方恨少“,比如这次单纯的使用串口1已经不足以满足需求,我想过使用串口2,可是在这样时间比较紧的情况下,我还有那么多时间区进行串口2调试吗?或许有人说,串口2跟1差不多,直接用啊,,,但是我想说,对于一个没有用的东西来说,在时间紧,任务多的情况下,已然没有时间再去搞了,及时它比较简单,而且平时对于各个外设的使用没有总结,不知道有何区别,又如何快速熟练的使用呢?这个问题确实值得注意……
以上就是我在这两天的调试中所总结的自己的问题,学习不能像蜻蜓点水一样,否则,真正到用的时候就该傻眼了,希望大家看了之后能够吸取我的教训,在生活中就注意这些问题。 同时,以上总结也是我自己个人最自己的总结,带有强烈的主管色彩,希望大家看看就好,有什么问题,欢迎留言……加油,小火把!