这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【10月10更新】tuntown自平衡小车DIY 进程 整定PID参数,附带走8

共13条 1/2 1 2 跳转至

【10月10更新】tuntown自平衡小车DIY 进程 整定PID参数,附带走8字视频

助工
2015-07-29 18:36:21     打赏

8月21日更新


1L收到机器,安装

http://forum.eepw.com.cn/thread/275217/1#1


2L焊接调试

http://forum.eepw.com.cn/thread/275217/1#2



3L CCD调试

http://forum.eepw.com.cn/thread/275217/1#3

4L 【发现】比官方更好用的虚拟示波器。

http://forum.eepw.com.cn/thread/275217/1#4


7L【编码器数据采集实验】 24L01的调试

8L无线通讯实验无线波形传输


http://forum.eepw.com.cn/thread/275217/1#7


9L OLED的调试

http://forum.eepw.com.cn/thread/275217/1#9


10L 【PID调试】【实现平衡小车直立时处于静止状态 】蓝牙功能的借鉴,PID的整定

http://forum.eepw.com.cn/thread/275217/1#10

11L 【实现小车走八字】整定PID成果展示,附加走八字

http://forum.eepw.com.cn/thread/275217/2#11

12L【结语感悟】

http://forum.eepw.com.cn/thread/275217/2#12

东西早就到了,一直忙着准备电赛。先组装。

全家图

没有买stlink和串口线,自己有jlink了,串口直接用自己开发板上的串口模块。

支架是3D打印的,第一次接触3D打印实物。电机旧的不过看起来很有质感,和国产香蕉黄不是一个档次

先装上轮子。轮子的橡胶很好,摩擦力很大,和那种网上买的黄色小车轮子完全不一样

紧接着电池,电池字要朝上,顺便充上电。不过这个充电器一开始有一个灯不亮,万用表测量输出电压正常,本以为LED灯是坏的,但是更换LED后依然不亮。就没敢继续使用,联系了卖家,态度很好立马发了一个。

但是我是拍的比较晚的了,不明白为什么电池是旧版的。哎。。。

板子特写,做工不错的。很细心把电池连接处做了绝缘处理


安装主板和显示屏。这里有个重点就是铜柱长短问题。上下铜柱搞错了,就会造成顶盖亚克力安装不上。后来又拆了重新装铜柱。

安好了,来一张开机前照片。



助工
2015-07-29 18:48:46     打赏
2楼

开机后调试小车正常。但是在虚拟示波器上遇到了问题,卡了将近一周的时间。

原因就是不支持win8,于是楼主用虚拟机安装了xp运行。发现要不就是连接不上要不就是接收到的频率特别慢,也就是数据有丢失。后来换了串口芯片也不行,最后换了物理机才发现是虚拟机效率影响了串口传输。大家也注意一下。

由于楼主有jlink了,所以就直接用jlink调试。调试的连线SWD方式与ST-link有所不同,需要4根线而不是3根。有人以为那根VCC不用接,因为说明手册提到了用小车供电,不用外接电源。但是对于jlink的要注意,pin1的VCC除了具有供电能力(如果你用跳线设置了对外供电),还是用于检测目标板复位信号的引脚,如果你不接这根线是不能正常使用的。貌似看群里有的同学用jlink遇到了此问题。

为了方便连接楼主用杜邦线自制了连线,不用每次搞错顺序了。

小车上VCC就接到随便一个3.3V插针。为了方便楼主把所有插针都焊接上了。


助工
2015-08-10 17:53:09     打赏
3楼

8月10日更新【CCD测试】

为了方便展示和学习。我用的是标准的zet6开发板。首先查阅资料得知引脚顺序,然后将板子和摄像头连接。A00不用连接。A0接单片机内部ADC引脚,楼主这里接的是PA7 PA12 PD4.电源最大可用5.5V。为了和小车上的硬件环境相匹配,楼主这里用的3.3V。

将ADC.H和.C拷贝到工程目录HARDWARE里。

keilc里添加文件


适当修改代码。

这几个地方修改好了,就可以了。

主程序部分如下,很简洁,打开串口和CCD ADC初始化(ADC在CCD的初始化函数里已经做好了)。然后while里循环CCD();进行转换输出,通过串口上位机进行调试。

楼主串口用的115200.不要用过高,接收的效果会变差。

用黑笔在白纸上划线进行调试。如图


打开上位机

调节背面运放的电位器可以控制放大倍数,也可以在程序里调节。其实这个外部运放没有必要,学过摄影的应该了解,调节感光度也就是调节ADC的放大倍数,这个用外部运放和STM32自带的ADC是一个效果的。

然后这个摄像头有缺陷,背部的蓝色LED发的光会透过PCB干扰成像。所以用电烙铁把背部的LED去掉。然后建议调节好后,用黑胶布粘住PCB背面。做过车的都懂。

把摄像头上的螺丝拧掉,可以调节焦距,把透镜去掉后,可以看到,蓝色LED的光会穿透PCB。

调节过程

最后调节好的效果图。

还差算法。


助工
2015-08-20 20:44:47     打赏
4楼

【发现】比官方更好用的虚拟示波器。

无意中找jlink串口的时候发现的,在jlink 4.9e以上版本新增了一个jlink scope。可以直接用jlink读取变量并以图形化方式显示出来。其中v8版本的jlink只能以较低速率50Hz运行,并且不超过10个变量。新版的v9则只受限于usb端口的带宽。不过对于做小车已经足够了,而且这个速率要比官方提供的方案快很多,而且不占用cpu资源(也就是说你用DMP也可以用示波器了)

首先下载新版jlink驱动

安装后从根目录找到jscope.exe。运行

小车和jlink连接好4根线(stlink是3根,jlink要连接VCC)


按如下配置。

最下方的选择你项目文件夹中的OBJ目录,寻找axf文件。这个用途是提取你程序中的变量。

然后确定

出现上述画面,选择需要监控的变量。这里勾选了两路编码器和角度。

mdk烧写程序后,在scope里点红色按钮就可以运行了。可以选择下方变量列表,用小键盘的+ -号控制放大缩小,调整到合适大小。可以明显看到比什么串口示波器效率好多了。反应很灵敏。楼主用的是jlink v8,用V9的可以无限制频率和变量个数。推荐大家试试



菜鸟
2015-08-21 18:18:10     打赏
5楼
赞!不错哦

助工
2015-08-21 19:10:21     打赏
6楼
你有没有在小车上试过CCD?

助工
2015-08-21 22:07:44     打赏
7楼

24l01调试

这里用一个开发板和小车进行24l01通讯实验。未来打算用无线通讯整定PID参数。

首先是连接,把模块插到开发板上,小车上。

开发板的代码用的是战舰给的代码,适当修改,使用的是SPI2。小车是用的官方例程SPI1。

楼主对检测程序进行了修改,原先的程序是当2401未插入,提示灯会闪烁,但是这里会造成问题,程序正常执行也是蓝灯闪烁。所以楼主把代码改了,蓝灯常亮代表2401检测未通过。

这是小车的连接方法,其实设计成向里反过来更好,对2401的电路是个保护。


然后下载代码。这里对接收端的战舰开发板代码进行了修改,直接设定为RX。


可以看到接收成功


视频地址:http://player.youku.com/player.php/sid/XMTM1MDI2NDQwOA==/v.swf


助工
2015-08-23 00:56:52     打赏
8楼

24l01无线传输进一步研究

 今天利用小车和一个stm32开发板实现将小车数据无线传输至上位机。原理就是小车用2401发送变量到开发板,开发板用先前介绍过的jlink-scope获取数据到上位机并显示波形。因为获取数据直接用jlink,所以开发板只需要接收代码即可,不用编写任何发送代码,也不用考虑发送格式,非常简便。这里有一点要注意就是jlinkscope对float浮点数支持有点问题,所以在开发板的程序里,将角度值定义成了int整形,并没有什么影响,如果担心零度问题,另一个选择是将角度值乘10或者100倍,这样就保留了小数点后1位 2位,然后在上位机的图形中适当缩放即可。不过楼主这里看了下,1度的精度足矣。未来楼主打算用24l01传输小车的波形显示数据信息,用蓝牙进行PID参数的整定。这样可以彻底抛弃串口线和swo线。而且在DMP算法下也可以实现数据传输显示。通过24L01将小车的信息传递到stm32开发板上,然后stm32开发板将数据用jlink或者串口传递到电脑上位机上。这样实现了波形的无线显示,然后用蓝牙进行pid数据的修改整定。这样小车充好电后,就无需任何数据线就可以进行监控和调试了。

以下是开发板上的代码和小车上的代码部分修改。


成功实现波形无线传输。


助工
2015-10-02 16:34:53     打赏
9楼

OLED实验

代码用的是战舰自带的,然后对引脚做了改动

这是要显示的内容

然后修改对应的引脚

同时记得改OLED_MODE,因为战舰的OLED支持3种模式。这里只用SPI模式,所以为0

好了。最后看一下效果

然后下面这个顺便测试了下FLASH。和本文测试内容无关。

最后来了个按钮切换。

OLED比较简单,大致就是显示内容。驱动部分直接使用就好了。需要注意的就是效率问题,写入所有数据最后刷新,要好过写一行刷新一次。


助工
2015-10-02 16:54:42     打赏
10楼

蓝牙部分的改进

由于要进行PID参数的整定。需要进行PID的快捷调试,如果每次都通过刷写固件的方式进行,效率太低而且对芯片寿命也有影响。所以这里对蓝牙部分进行功能扩展,通过电脑蓝牙连接小车,进行PID的整定。

这里感谢xxJian,看了他的帖子感觉蓝牙调整PID写的非常棒,就借鉴过来,具体部分如下。

//xxJian code 2 begins

if(uart_receive>0x20)    TuningPIDdata[0]=uart_receive;


//-------------------------------------------------------------
//Angle Bias
//update Angle Bias
if(TuningPIDdata[0]=='+'
&&TuningPIDdata[1]=='B'
&&TuningPIDdata[2]=='A')
{
AngleBias = AngleBias + 0.1;
while((USART3->SR&0X40)==0);
USART3->DR = 'A';
while((USART3->SR&0X40)==0);
USART3->DR = 'n';
while((USART3->SR&0X40)==0);
USART3->DR = 'g';
while((USART3->SR&0X40)==0);
USART3->DR = 'l';
while((USART3->SR&0X40)==0);
USART3->DR = 'e';
while((USART3->SR&0X40)==0);
USART3->DR = 'B';
while((USART3->SR&0X40)==0);
USART3->DR = 'i';
while((USART3->SR&0X40)==0);
USART3->DR = 'a';
while((USART3->SR&0X40)==0);
USART3->DR = 's';
while((USART3->SR&0X40)==0);
USART3->DR = '=';
if(AngleBias<0)
{
while((USART3->SR&0X40)==0);
USART3->DR = '-';
}
while((USART3->SR&0X40)==0);
if(AngleBias<0)
USART3->DR = (int32_t)-AngleBias%10+'0';
else
USART3->DR = (int32_t)AngleBias%10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = '.';
while((USART3->SR&0X40)==0);
if(AngleBias<0)
USART3->DR = (uint32_t)(-AngleBias*10)%10+'0';
else
USART3->DR = (uint32_t)(AngleBias*10)%10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = '\n';
}
if(TuningPIDdata[0]=='-'
&&TuningPIDdata[1]=='B'
&&TuningPIDdata[2]=='A')
{
AngleBias = AngleBias - 0.1;
while((USART3->SR&0X40)==0);
USART3->DR = 'A';
while((USART3->SR&0X40)==0);
USART3->DR = 'n';
while((USART3->SR&0X40)==0);
USART3->DR = 'g';
while((USART3->SR&0X40)==0);
USART3->DR = 'l';
while((USART3->SR&0X40)==0);
USART3->DR = 'e';
while((USART3->SR&0X40)==0);
USART3->DR = 'B';
while((USART3->SR&0X40)==0);
USART3->DR = 'i';
while((USART3->SR&0X40)==0);
USART3->DR = 'a';
while((USART3->SR&0X40)==0);
USART3->DR = 's';
while((USART3->SR&0X40)==0);
USART3->DR = '=';
if(AngleBias<0)
{
while((USART3->SR&0X40)==0);
USART3->DR = '-';
}
while((USART3->SR&0X40)==0);
if(AngleBias<0)
USART3->DR = (int32_t)-AngleBias%10+'0';
else
USART3->DR = (int32_t)AngleBias%10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = '.';
while((USART3->SR&0X40)==0);
if(AngleBias<0)
USART3->DR = (uint32_t)(-AngleBias*10)%10+'0';
else
USART3->DR = (uint32_t)(AngleBias*10)%10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = '\n';
}
//-------------------------------------------------------------
//Balance PID
//update Balance Kp
if(TuningPIDdata[0]=='+'
&&TuningPIDdata[1]=='p'
&&TuningPIDdata[2]=='B')
{
B_Kp = B_Kp + 0.1;
while((USART3->SR&0X40)==0);
USART3->DR = 'B';
while((USART3->SR&0X40)==0);
USART3->DR = '_';
while((USART3->SR&0X40)==0);
USART3->DR = 'K';
while((USART3->SR&0X40)==0);
USART3->DR = 'p';
while((USART3->SR&0X40)==0);
USART3->DR = '=';
while((USART3->SR&0X40)==0);
USART3->DR = B_Kp/10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = (int32_t)B_Kp%10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = '.';
while((USART3->SR&0X40)==0);
USART3->DR = (uint32_t)(B_Kp*10)%10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = '\n';
}
if(TuningPIDdata[0]=='-'
&&TuningPIDdata[1]=='p'
&&TuningPIDdata[2]=='B')
{
B_Kp = B_Kp - 0.1;
while((USART3->SR&0X40)==0);
USART3->DR = 'B';
while((USART3->SR&0X40)==0);
USART3->DR = '_';
while((USART3->SR&0X40)==0);
USART3->DR = 'K';
while((USART3->SR&0X40)==0);
USART3->DR = 'p';
while((USART3->SR&0X40)==0);
USART3->DR = '=';
while((USART3->SR&0X40)==0);
USART3->DR = B_Kp/10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = (int32_t)B_Kp%10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = '.';
while((USART3->SR&0X40)==0);
USART3->DR = (uint32_t)(B_Kp*10)%10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = '\n';
}
//update Balance Ki
if(TuningPIDdata[0]=='+'
&&TuningPIDdata[1]=='i'
&&TuningPIDdata[2]=='B')
{
B_Ki = B_Ki + 0.001;
while((USART3->SR&0X40)==0);
USART3->DR = 'B';
while((USART3->SR&0X40)==0);
USART3->DR = '_';
while((USART3->SR&0X40)==0);
USART3->DR = 'K';
while((USART3->SR&0X40)==0);
USART3->DR = 'i';
while((USART3->SR&0X40)==0);
USART3->DR = '=';
while((USART3->SR&0X40)==0);
USART3->DR = '0';
while((USART3->SR&0X40)==0);
USART3->DR = '.';
while((USART3->SR&0X40)==0);
USART3->DR = (uint32_t)(B_Ki*10)+'0';
while((USART3->SR&0X40)==0);
USART3->DR = (uint32_t)(B_Ki*100)%10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = (uint32_t)(B_Ki*1000)%10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = '\n';
}
if(TuningPIDdata[0]=='-'
&&TuningPIDdata[1]=='i'
&&TuningPIDdata[2]=='B')
{
B_Ki = B_Ki - 0.001;
while((USART3->SR&0X40)==0);
USART3->DR = 'B';
while((USART3->SR&0X40)==0);
USART3->DR = '_';
while((USART3->SR&0X40)==0);
USART3->DR = 'K';
while((USART3->SR&0X40)==0);
USART3->DR = 'i';
while((USART3->SR&0X40)==0);
USART3->DR = '=';
while((USART3->SR&0X40)==0);
USART3->DR = '0';
while((USART3->SR&0X40)==0);
USART3->DR = '.';
while((USART3->SR&0X40)==0);
USART3->DR = (uint32_t)(B_Ki*10)+'0';
while((USART3->SR&0X40)==0);
USART3->DR = (uint32_t)(B_Ki*100)%10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = (uint32_t)(B_Ki*1000)%10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = '\n';
}
//update Balance Kd
if(TuningPIDdata[0]=='+'
&&TuningPIDdata[1]=='d'
&&TuningPIDdata[2]=='B')
{
B_Kd = B_Kd + 0.001;
while((USART3->SR&0X40)==0);
USART3->DR = 'B';
while((USART3->SR&0X40)==0);
USART3->DR = '_';
while((USART3->SR&0X40)==0);
USART3->DR = 'K';
while((USART3->SR&0X40)==0);
USART3->DR = 'd';
while((USART3->SR&0X40)==0);
USART3->DR = '=';
while((USART3->SR&0X40)==0);
USART3->DR = '0';
while((USART3->SR&0X40)==0);
USART3->DR = '.';
while((USART3->SR&0X40)==0);
USART3->DR = (uint32_t)(B_Kd*10)+'0';
while((USART3->SR&0X40)==0);
USART3->DR = (uint32_t)(B_Kd*100)%10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = (uint32_t)(B_Kd*1000)%10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = '\n';
}
if(TuningPIDdata[0]=='-'
&&TuningPIDdata[1]=='d'
&&TuningPIDdata[2]=='B')
{
B_Kd = B_Kd - 0.001;
while((USART3->SR&0X40)==0);
USART3->DR = 'B';
while((USART3->SR&0X40)==0);
USART3->DR = '_';
while((USART3->SR&0X40)==0);
USART3->DR = 'K';
while((USART3->SR&0X40)==0);
USART3->DR = 'd';
while((USART3->SR&0X40)==0);
USART3->DR = '=';
while((USART3->SR&0X40)==0);
USART3->DR = '0';
while((USART3->SR&0X40)==0);
USART3->DR = '.';
while((USART3->SR&0X40)==0);
USART3->DR = (uint32_t)(B_Kd*10)+'0';
while((USART3->SR&0X40)==0);
USART3->DR = (uint32_t)(B_Kd*100)%10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = (uint32_t)(B_Kd*1000)%10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = '\n';
}
//-------------------------------------------------------------
//Velocity PID
//update Velocity Kp
if(TuningPIDdata[0]=='+'
&&TuningPIDdata[1]=='p'
&&TuningPIDdata[2]=='V')
{
V_Kp = V_Kp + 0.1;
while((USART3->SR&0X40)==0);
USART3->DR = 'V';
while((USART3->SR&0X40)==0);
USART3->DR = '_';
while((USART3->SR&0X40)==0);
USART3->DR = 'K';
while((USART3->SR&0X40)==0);
USART3->DR = 'p';
while((USART3->SR&0X40)==0);
USART3->DR = '=';
while((USART3->SR&0X40)==0);
USART3->DR = V_Kp/10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = (int32_t)V_Kp%10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = '.';
while((USART3->SR&0X40)==0);
USART3->DR = (uint32_t)(V_Kp*10)%10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = '\n';
}
if(TuningPIDdata[0]=='-'
&&TuningPIDdata[1]=='p'
&&TuningPIDdata[2]=='V')
{
V_Kp = V_Kp - 0.1;
while((USART3->SR&0X40)==0);
USART3->DR = 'V';
while((USART3->SR&0X40)==0);
USART3->DR = '_';
while((USART3->SR&0X40)==0);
USART3->DR = 'K';
while((USART3->SR&0X40)==0);
USART3->DR = 'p';
while((USART3->SR&0X40)==0);
USART3->DR = '=';
while((USART3->SR&0X40)==0);
USART3->DR = V_Kp/10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = (int32_t)V_Kp%10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = '.';
while((USART3->SR&0X40)==0);
USART3->DR = (uint32_t)(V_Kp*10)%10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = '\n';
}
//update Velocity Ki
if(TuningPIDdata[0]=='+'
&&TuningPIDdata[1]=='i'
&&TuningPIDdata[2]=='V')
{
V_Ki = V_Ki + 0.001;
while((USART3->SR&0X40)==0);
USART3->DR = 'V';
while((USART3->SR&0X40)==0);
USART3->DR = '_';
while((USART3->SR&0X40)==0);
USART3->DR = 'K';
while((USART3->SR&0X40)==0);
USART3->DR = 'i';
while((USART3->SR&0X40)==0);
USART3->DR = '=';
while((USART3->SR&0X40)==0);
USART3->DR = '0';
while((USART3->SR&0X40)==0);
USART3->DR = '.';
while((USART3->SR&0X40)==0);
USART3->DR = (uint32_t)(V_Ki*10)+'0';
while((USART3->SR&0X40)==0);
USART3->DR = (uint32_t)(V_Ki*100)%10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = (uint32_t)(V_Ki*1000)%10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = '\n';
}
if(TuningPIDdata[0]=='-'
&&TuningPIDdata[1]=='i'
&&TuningPIDdata[2]=='V')
{
V_Ki = V_Ki - 0.001;
while((USART3->SR&0X40)==0);
USART3->DR = 'V';
while((USART3->SR&0X40)==0);
USART3->DR = '_';
while((USART3->SR&0X40)==0);
USART3->DR = 'K';
while((USART3->SR&0X40)==0);
USART3->DR = 'i';
while((USART3->SR&0X40)==0);
USART3->DR = '=';
while((USART3->SR&0X40)==0);
USART3->DR = '0';
while((USART3->SR&0X40)==0);
USART3->DR = '.';
while((USART3->SR&0X40)==0);
USART3->DR = (uint32_t)(V_Ki*10)+'0';
while((USART3->SR&0X40)==0);
USART3->DR = (uint32_t)(V_Ki*100)%10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = (uint32_t)(V_Ki*1000)%10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = '\n';

}
//-------------------------------------------------------------
//Turn PID
//update Turn Kp
if(TuningPIDdata[0]=='+'
&&TuningPIDdata[1]=='p'
&&TuningPIDdata[2]=='T')
{
T_Kp = T_Kp + 0.1;
while((USART3->SR&0X40)==0);
USART3->DR = 'T';
while((USART3->SR&0X40)==0);
USART3->DR = '_';
while((USART3->SR&0X40)==0);
USART3->DR = 'K';
while((USART3->SR&0X40)==0);
USART3->DR = 'p';
while((USART3->SR&0X40)==0);
USART3->DR = '=';
while((USART3->SR&0X40)==0);
USART3->DR = T_Kp/10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = (int32_t)T_Kp%10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = '.';
while((USART3->SR&0X40)==0);
USART3->DR = (uint32_t)(T_Kp*10)%10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = '\n';
}
if(TuningPIDdata[0]=='-'
&&TuningPIDdata[1]=='p'
&&TuningPIDdata[2]=='T')
{
T_Kp = T_Kp - 0.1;
while((USART3->SR&0X40)==0);
USART3->DR = 'T';
while((USART3->SR&0X40)==0);
USART3->DR = '_';
while((USART3->SR&0X40)==0);
USART3->DR = 'K';
while((USART3->SR&0X40)==0);
USART3->DR = 'p';
while((USART3->SR&0X40)==0);
USART3->DR = '=';
while((USART3->SR&0X40)==0);
USART3->DR = T_Kp/10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = (int32_t)T_Kp%10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = '.';
while((USART3->SR&0X40)==0);
USART3->DR = (uint32_t)(T_Kp*10)%10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = '\n';
}
//update Turn Kd
if(TuningPIDdata[0]=='+'
&&TuningPIDdata[1]=='d'
&&TuningPIDdata[2]=='T')
{
T_Kd = T_Kd + 0.001;
while((USART3->SR&0X40)==0);
USART3->DR = 'T';
while((USART3->SR&0X40)==0);
USART3->DR = '_';
while((USART3->SR&0X40)==0);
USART3->DR = 'K';
while((USART3->SR&0X40)==0);
USART3->DR = 'd';
while((USART3->SR&0X40)==0);
USART3->DR = '=';
while((USART3->SR&0X40)==0);
USART3->DR = '0';
while((USART3->SR&0X40)==0);
USART3->DR = '.';
while((USART3->SR&0X40)==0);
USART3->DR = (uint32_t)(T_Kd*10)+'0';
while((USART3->SR&0X40)==0);
USART3->DR = (uint32_t)(T_Kd*100)%10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = (uint32_t)(T_Kd*1000)%10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = '\n';

}
if(TuningPIDdata[0]=='-'
&&TuningPIDdata[1]=='d'
&&TuningPIDdata[2]=='T')
{
T_Kd = T_Kd - 0.001;
while((USART3->SR&0X40)==0);
USART3->DR = 'T';
while((USART3->SR&0X40)==0);
USART3->DR = '_';
while((USART3->SR&0X40)==0);
USART3->DR = 'K';
while((USART3->SR&0X40)==0);
USART3->DR = 'd';
while((USART3->SR&0X40)==0);
USART3->DR = '=';
while((USART3->SR&0X40)==0);
USART3->DR = '0';
while((USART3->SR&0X40)==0);
USART3->DR = '.';
while((USART3->SR&0X40)==0);
USART3->DR = (uint32_t)(T_Kd*10)+'0';
while((USART3->SR&0X40)==0);
USART3->DR = (uint32_t)(T_Kd*100)%10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = (uint32_t)(T_Kd*1000)%10+'0';
while((USART3->SR&0X40)==0);
USART3->DR = '\n';
}

TuningPIDdata[4]=TuningPIDdata[3];
TuningPIDdata[3]=TuningPIDdata[2];
TuningPIDdata[2]=TuningPIDdata[1];
TuningPIDdata[1]=TuningPIDdata[0];
//xxJian code 2 ends
替换了80行以后的代码

好了,通过修改蓝牙部分的代码,实现了蓝牙整定PID的功能。

通过修改24L01的代码,实现了无线数据示波器显示。

下面就可以进行pid的整定了。

看网友的建议,直立环和速度环是相辅相成的,如果调试直立单纯通过通过保留直立环,而屏蔽了速度和转向环进行调试效果并不好,所以尝试带有速度环和直立环进行调试。

屏蔽方法截图


屏蔽后,添加了蓝牙部分的调试代码。这里借用xxJian兄的代码。感谢。

然后进行PID的调试,经过初步调试,发下视频。视频可以看到调试的还不是很完美,直立状态会晃,可以进行前进后退操作,此时进行左右转向时无效。

http://player.youku.com/player.php/sid/XMTM1MDI2Mzc4MA==/v.swf
视频地址:http://player.youku.com/player.php/sid/XMTM1MDI2Mzc4MA==/v.swf


共13条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]