[开发进程]实验三、通过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上联系!另外软件我已经放到群共享了。有需要请自行下载!
我要赚赏金
