5214|9

661

帖子

29

TA的资源

版主

楼主
 

【lpc54100】平衡小车无线串口调参系统 [复制链接]

本帖最后由 lb8820265 于 2015-5-6 16:12 编辑

先上视频:



        视屏中使用lpc54100开发板为主控制器,VC编写的上位机空调节相关参数和显示相关数据和姿态,这次的软件较上一次的有了改进,由之前的采用SerialPort类变成了使用软件自带的mscomm串口控件,这个控件更加稳定,然后能够实现同时收发。然后增加了OpenGL显示姿态。修改了不少Bug,增加了Bug显示区域。同时msp430的上位机接收机也做了改进,增加了可靠性,提高了主频。
         视屏中的小车只有姿态控制而没有速度控制,然后上位机调参窗口中,第一个是小车初始角度,第二个是姿态控制P参数,第三个是姿态控制D参数。在小车的显示屏上能够显示相关参数。通过查看小车传回来的PWM输出,小车速度,小车姿态以及小车的实际情况来调节参数。
         下面是相关代码与解释:
main函数:
  1. int32_t main(void)
  2. {
  3.         // Setup SystemCoreClock and any needed board code
  4.         SystemCoreClockUpdate();
  5.         //SysTick_Config(SystemCoreClock/TICKRATE_HZ);
  6.         Board_SetupMuxing();
  7.         I2C_Config();
  8.          while(!MPUchack());
  9.         Init_MPU6050();
  10.                 SPI_INIT();
  11.          while(NRF24L01_Check());
  12.         NRF24L01_RT_Init();
  13.         Board_UART_Init ( LPC_USART0, 115200, &UART0arg );
  14.         Chip_SCTPWM_Init(SCT_PWM);//初始化STC
  15.         Chip_SCTPWM_SetRate(SCT_PWM, 10000);//波特率为10K
  16.         //四个引脚的功能设定为SCT0_OUT0
  17.         Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 7, IOCON_FUNC2 | IOCON_MODE_INACT | IOCON_DIGITAL_EN | IOCON_INPFILT_OFF);
  18.         Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 8, IOCON_FUNC2 | IOCON_MODE_INACT | IOCON_DIGITAL_EN | IOCON_INPFILT_OFF);
  19.         Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 29, IOCON_FUNC2 | IOCON_MODE_INACT | IOCON_DIGITAL_EN | IOCON_INPFILT_OFF);        
  20.         Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 30, IOCON_FUNC2 | IOCON_MODE_INACT | IOCON_DIGITAL_EN | IOCON_INPFILT_OFF);
  21.         Chip_SCTPWM_SetOutPin(SCT_PWM, 1, 0);//P0_7引脚,设置标号为1
  22.         Chip_SCTPWM_SetOutPin(SCT_PWM, 2, 1);//P0_8引脚,设置标号为2
  23.         Chip_SCTPWM_SetOutPin(SCT_PWM, 3, 2);//P0_29引脚,设置标号为3
  24.         Chip_SCTPWM_SetOutPin(SCT_PWM, 4, 3);//P0_30引脚,设置标号为4
  25.         Chip_SCTPWM_Start(SCT_PWM);
  26.         Chip_SCTPWM_SetDutyCycle(SCT_PWM, 2,Chip_SCTPWM_PercentageToTicks(LPC_SCT, 0));
  27.                                 Chip_SCTPWM_SetDutyCycle(SCT_PWM, 1,Chip_SCTPWM_PercentageToTicks(LPC_SCT, 0));
  28.         SetDisplay(Grey,Black,White);        
  29.         DisplayTitle("       lb8820265.");
  30.         SetColor(Yellow, Grey);
  31.          Chip_MRT_Init();
  32.                 Chip_MRT_SetDisabled(Chip_MRT_GetRegPtr(0));
  33.         // DLY(120000);
  34.         NVIC_EnableIRQ(MRT_IRQn);
  35.         setupMRT(0, MRT_MODE_REPEAT,  125);
  36.         while(1){
  37.                                         for(a=0;a<15;a++)        show[a]=0;
  38.                 if(car_angle_set<0){temp=-car_angle_set;
  39.                         show[0]=45;}
  40.                 else {show[0]=48;temp=car_angle_set;}
  41.                 show[1]=((int )temp%100)/10+48;
  42.                 show[2]=(int )temp%10+48;
  43.                 show[3]=32;
  44.                 show[4]=(int )g_fAngleControlP/100+48;
  45.                 show[5]=((int )g_fAngleControlP%100)/10+48;
  46.                 show[6]=(int )g_fAngleControlP%10+48;
  47.                 show[7]=32;
  48.                 show[8]=(int )g_fAngleControlD/100+48;
  49.                 show[9]=((int )g_fAngleControlD%100)/10+48;
  50.                 show[10]=(int )g_fAngleControlD%10+48;
  51.                 show[11]=32;
  52.                 show[12]=(int )SYS_ms/100+48;
  53.                 show[13]=((int )SYS_ms%100)/10+48;
  54.                 show[14]=(int )SYS_ms%10+48;
  55.         GLCD_DisplayString(130, 160, 2, 1, show );        //参数显示
  56.                 }
  57. }
复制代码
定时中断服务函数:
  1. void MRT_IRQHandler(void)
  2. {
  3. uint32_t int_pend;
  4.         char b[3];
  5.         int_pend = Chip_MRT_GetIntPending();
  6.         Chip_MRT_ClearIntPending(int_pend);
  7.         if (int_pend & MRTn_INTFLAG(0)) {
  8.                 Nrf_Check_Event();//nrf24l01相关操作
  9.                 SYS_ms++;        
  10.    readdmp();  //mpu6050数据读取
  11.    getquaternion();
  12.    getgyro();
  13.    getaccel();
  14.    getyawpitchroll();
  15.         AngleControl();//角度控制
  16.                 if(g_fAngleControlOut>0){//PWM控制电机输出
  17.                   Chip_SCTPWM_SetDutyCycle(SCT_PWM, 1, Chip_SCTPWM_PercentageToTicks(LPC_SCT, (int)g_fAngleControlOut));
  18.                                 Chip_SCTPWM_SetDutyCycle(SCT_PWM, 2,Chip_SCTPWM_PercentageToTicks(LPC_SCT, 0));
  19.         Chip_SCTPWM_SetDutyCycle(SCT_PWM,3 , Chip_SCTPWM_PercentageToTicks(LPC_SCT, (int)g_fAngleControlOut));
  20.                                 Chip_SCTPWM_SetDutyCycle(SCT_PWM, 4,Chip_SCTPWM_PercentageToTicks(LPC_SCT, 0));
  21.                 }                        
  22.                 else{
  23.                         Chip_SCTPWM_SetDutyCycle(SCT_PWM, 1, Chip_SCTPWM_PercentageToTicks(LPC_SCT, 0));
  24.                                 Chip_SCTPWM_SetDutyCycle(SCT_PWM, 2,Chip_SCTPWM_PercentageToTicks(LPC_SCT, (int)-g_fAngleControlOut));
  25.         Chip_SCTPWM_SetDutyCycle(SCT_PWM,3 , Chip_SCTPWM_PercentageToTicks(LPC_SCT,0));
  26.                                 Chip_SCTPWM_SetDutyCycle(SCT_PWM, 4,Chip_SCTPWM_PercentageToTicks(LPC_SCT, (int)-g_fAngleControlOut));
  27.                 }                        
  28.         }
  29. }
复制代码
Nrf_Check_Event函数:
  1. void Nrf_Check_Event(void)
  2. {
  3.         uchar sta = NRF24L01_Read_Reg(READ_REG + STATUS);
  4.         if(sta & (RX_OK))//接收中断
  5.         {
  6.                 uchar rx_len = NRF24L01_Read_Reg(R_RX_PL_WID);
  7.                 NRF24L01_Read_Buf(RD_RX_PLOAD,NRF24L01_RXDATA,rx_len);
  8. //NRF_TxPacket_AP(NRF24L01_RXDATA,rx_len);
  9.                  if(NRF24L01_RXDATA[0]=='b')//如果接收到的第一个字符是‘b’
  10.                 lb_put_parameter();//将要发送的相关参数放到将要发送的寄存器中
  11.      else if(NRF24L01_RXDATA[0]=='l')//如果接收到的第一个字符是‘l’
  12.                 lb_put_original();//将参数的值放到将要发送的寄存器中
  13.                  else if(NRF24L01_RXDATA[0]=='s')//如果接收到的第一个字符是‘s’
  14.                lb_get_parameter();//将接收到的值修改目前的参数
  15.         }
  16.         if(sta & (TX_OK))
  17.         {
  18.         }
  19.         if(sta & (MAX_TX))
  20.         {
  21.                 if(sta & 0x01)        //TX FIFO FULL
  22.                 {
  23.                         NRF24L01_Write_Reg(FLUSH_TX,0xff);
  24.                 }
  25.         }
  26.         NRF24L01_Write_Reg(WRITE_REG + STATUS, sta);//
  27.         sta = NRF24L01_Read_Reg(READ_REG + STATUS);
  28. }
复制代码
lb_put_parameter函数,其他两个函数差不多不再贴出
  1. void lb_put_parameter(void)
  2. {
  3. unsigned char check;        
  4. char tx[27];
  5. int temp[4];
  6. float temp2[4];
  7. char *p;
  8. int i=0;
  9. temp[0]=g_fAngleControlOut;//将PWM输出值放到int型数组中,将会在示波器曲线1中显示
  10. temp[1]=g_fAngleSpeed;//将小车速度放到一个int型数组中,将会在示波器曲线2中显示
  11. temp[2]=0;
  12. temp[3]=g_fCarAngle;//将小车偏角放到一个int型数组中,将会在示波器曲线4中显示
  13. temp2[0]=(float)yprf[0];//将欧拉角放到一个float型数组中,将会在OpenGL图像中显示
  14. temp2[1]=(float)yprf[1];//将欧拉角放到一个float型数组中,将会在OpenGL图像中显示
  15. temp2[2]=(float)yprf[2];//将欧拉角放到一个float型数组中,将会在OpenGL图像中显示
  16. temp2[3]=0;
  17. for(i=0;i<4;i++){//将整数型数据变成字符型
  18.         if(temp[i]<0)
  19.         temp[i]=65536+temp[i];
  20.     tx[2*i+2]=(temp[i]%256);
  21.         tx[2*i+3]=(temp[i]/256);
  22. }
  23. for(i=0;i<4;i++){//将浮点型数据变成字符型
  24. p=(char *)&temp2[i];
  25. tx[10+i*4]=*p;
  26. tx[11+i*4]=*(p+1);
  27. tx[12+i*4]=*(p+2);
  28. tx[13+i*4]=*(p+3);
  29. }
  30. tx[0]='s';//数据头
  31. tx[1]='t';//数据头
  32. check = 0;
  33. for(i = 2; i < 26; i++) check += tx[i];//采用求和校验
  34. tx[26] = check+NRF24L01_Read_Reg(0x09); //将NRF4l01的信号强度放到求和校验中
  35. if(check==255)tx[26]=255;//防止错误
  36. NRF_TxPacket_AP(tx,27);//将要发送的27为char型数据放到将要ack发送的寄存器中
  37. }
复制代码
相关程序源代码打包下载:https://download.eeworld.com.cn/detail/lb8820265/554864包括msp430G2553程序,lpc54100程序,上位机程序,上位机源代码,上位机注册,使用说明。)

查看本帖全部内容,请登录或者注册
此帖出自NXP MCU论坛

最新回复

学习上位机,资料很适合我   详情 回复 发表于 2019-12-20 15:09
点赞(1) 关注
个人签名QQ:252669569
 

回复
举报

1403

帖子

1

TA的资源

纯净的硅(中级)

沙发
 
给力哈~~
此帖出自NXP MCU论坛
 
个人签名HELLO_WATER
 
 

回复

26

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
斌哥,小车不错,借我玩玩啊  呵呵
此帖出自NXP MCU论坛
 
 
 

回复

4

帖子

1

TA的资源

一粒金砂(初级)

4
 
顶@@@@@
此帖出自NXP MCU论坛
 
 
 

回复

4

帖子

1

TA的资源

一粒金砂(初级)

5
 
怎么得到新币
此帖出自NXP MCU论坛
 
 
 

回复

4

帖子

1

TA的资源

一粒金砂(初级)

6
 
怎么得到新币
此帖出自NXP MCU论坛
 
 
 

回复

855

帖子

5

TA的资源

一粒金砂(高级)

7
 
你好,我现在也在调平衡车,请问你的NRF是利用的伪双工通信还是自己实现的一套通信机制?
此帖出自NXP MCU论坛

点评

这一代的通信,原理是利用的NRF带数据的ACK模式,电脑发送一个指令通过NRF传给小车,小车收到后将带数据的ACK返回  详情 回复 发表于 2016-4-24 14:27
 
个人签名作为一个菜逼,干货并没有多少。唯一会的就是水,所以回帖水分大。望见谅!
 
 

回复

661

帖子

29

TA的资源

版主

8
 
人民币的幻想 发表于 2016-4-21 14:04
你好,我现在也在调平衡车,请问你的NRF是利用的伪双工通信还是自己实现的一套通信机制?

这一代的通信,原理是利用的NRF带数据的ACK模式,电脑发送一个指令通过NRF传给小车,小车收到后将带数据的ACK返回
此帖出自NXP MCU论坛

点评

,好的,谢谢  详情 回复 发表于 2016-4-24 14:40
 
个人签名QQ:252669569
 
 

回复

855

帖子

5

TA的资源

一粒金砂(高级)

9
 
lb8820265 发表于 2016-4-24 14:27
这一代的通信,原理是利用的NRF带数据的ACK模式,电脑发送一个指令通过NRF传给小车,小车收到后将带数据 ...

,好的,谢谢
此帖出自NXP MCU论坛
 
个人签名作为一个菜逼,干货并没有多少。唯一会的就是水,所以回帖水分大。望见谅!
 
 

回复

2

帖子

1

TA的资源

一粒金砂(初级)

10
 

学习上位机,资料很适合我

此帖出自NXP MCU论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
【干货上新】电源解决方案和技术第二趴 | DigiKey 应用探索站
当月好物、电源技术资源、特色活动、DigiKey在线实用工具,干货多多~

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 4

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表