[开发进程]实验三、通过Usart1显示小车角度、左右编码器、电池电压并分析
第一次接触平衡车,对控制电机方面是小白。借着活动举办方分享的全套代码,熟悉一下通过传感器进行单片机采样的几个重要的代码,其中分别是通过MPU6050得到的MCU主板的角度、通过编码器采集得到的电机转动速度、通过电阻分压得到的电池电压。其中前三个参数在控制小车的平衡中必不可少,而采集电池电压的作用主要是为了实时检测电池电压、有助于避免电池过放电。
好了,这次的实验所需要的实验材料是:EEPW平衡小车标配x1,PL2302模块x1,还有可以使用串口的win7电脑及其所需软件分别是串口调试助手&VisualScope
主要原理说明:
首先对比一下,VisualScope.exe(下文简称“VS.exe”)和上位机波形显(请在win7下以管理员的身份运行,不支持WIN8)示.exe(下文简称“上.exe”)的不同,当然只是个人理解而已!
1、 数据的通道数:VS.exe最多支持4通道、而上.exe最多支持10通道。
2、 数据可靠性与快速型:VS.exe支持Check Sum和CRC16进行对数据的检验,而上.exe暂时没发现。因此不校验的上.exe是比较快速的显示波形的。
3、 界面的友好程度:VS.exe支持Stretch功能,可以用鼠标将波形分别沿X轴和Y轴的放大。同时支持Move功能,将波形随意上下左右的平移。上.exe笔者接触了半天,没找到移动波形的方法。
也是第三个的区别,同时还不排除个人的偏见,让我偏爱VisualScope这款软件。
实验步骤:
在前面我已经介绍过VisualScope的使用(见本贴2楼) ,这次就直接放出代码。注意我改的工程是:Mini Balance V2.5 标准版源码(集成DMP 卡尔曼滤波 互补滤波)
首先在main.c初始化Flag_Show定义的地方,将该参数初始化为0
u8 Flag_Stop=1,Flag_Show=0;
然后,在show.c源文件中,将第64行以后的代码删除掉,改为下面的代码:
//=----------------------------------------------------------------------- //this is xxJian code 1 unsigned short CRC_CHECK(unsigned char *Buf, unsigned char CRC_CNT) { unsigned short CRC_Temp; unsigned char i,j; CRC_Temp = 0xffff; for (i=0;i<CRC_CNT; i++){ CRC_Temp ^= Buf[i]; for (j=0;j<8;j++) { if (CRC_Temp & 0x01) CRC_Temp = (CRC_Temp >>1 ) ^ 0xa001; else CRC_Temp = CRC_Temp >> 1; } } return(CRC_Temp); } void VisualScope_Output(float data1 ,float data2 ,float data3 ,float data4) { int temp[4] = {0}; unsigned int temp1[4] = {0}; uint8_t databuf[10] = {0}; unsigned char i; unsigned short CRC16 = 0; temp[0] = (int)data1; temp[1] = (int)data2; temp[2] = (int)data3; temp[3] = (int)data4; temp1[0] = (unsigned int)temp[0] ; temp1[1] = (unsigned int)temp[1]; temp1[2] = (unsigned int)temp[2]; temp1[3] = (unsigned int)temp[3]; for(i=0;i<4;i++) { databuf[i*2] = (unsigned char)(temp1[i]%256); databuf[i*2+1] = (unsigned char)(temp1[i]/256); } CRC16 = CRC_CHECK(databuf,8); databuf[8] = CRC16%256; databuf[9] = CRC16/256; for( i = 0 ; i < 10; i++) { while((USART1->SR&0X40)==0); USART1->DR = databuf[i]; } } //end of xxJian code 1 //------------------------------------------------------------------------ void DataScope(void) { //=----------------------------------------------------------------------- //this is xxJian code 2 float Volt; Volt = Voltage/100; //end of xxJian code 2 //----------------------------------------------------------------------------- if(++Count==1) { OLED_Clear(); OLED_Display_Off(); } //=----------------------------------------------------------------------- //this is the official source code /* DataScope_Get_Channel_Data( Angle_Balance, 1 ); DataScope_Get_Channel_Data( Encoder_Right, 2 ); DataScope_Get_Channel_Data( Encoder_Left, 3 ); DataScope_Get_Channel_Data( Voltage , 4 ); DataScope_Get_Channel_Data(0, 5 ); DataScope_Get_Channel_Data(0 , 6 ); DataScope_Get_Channel_Data(0, 7 ); DataScope_Get_Channel_Data( 0, 8 ); DataScope_Get_Channel_Data(0, 9 ); DataScope_Get_Channel_Data( 0 , 10); Send_Count = DataScope_Data_Generate(10); for( i = 0 ; i < Send_Count; i++) { while((USART1->SR&0X40)==0); USART1->DR = DataScope_OutPut_Buffer[i]; } */ //end of official source code //----------------------------------------------------------------------------- //=----------------------------------------------------------------------- //this is xxJian code 3 VisualScope_Output(Angle_Balance,Encoder_Right,Encoder_Left,Volt); //end of xxJian code 3 //----------------------------------------------------------------------------- delay_ms(50); //20HZ }
经过在keil上编译,用串口下载的方法,将程序下载到STM32C8内。详细用串口下载的过程请看
STM32使用MCUISP下载程序教程http://forum.eepw.com.cn/thread/273193/1
实验结果:
下载程序后,运行,要通过拨码开关将boot0置到on的位置。串口连接好,pl2302模块接到电脑上。打开VIsualScope将串口配置好,并点run.
然后就可以改变平衡小车的状态,观看通过传感器采集得到的数据的变化!
谢谢你的观看!如果有问题,可以留言,也可以QQ上联系!另外软件我已经放到群共享了。有需要请自行下载!