对stm32CubeMX生成的MDK ARM V5的工程代码进行编译,对外围器件、模块及小车底盘电机进行测试验证:
注意:对stm32CubeMX生成的MDK ARM V5的工程代码添加自己的变量、定义、函数必须在指定位置添加,不然如果CubeMX工程发生变化,重新生成MDK ARM工程时会删掉不符合规定区域外的代码。
一、添加串口打印printf
在“USER CODE BEGIN 4”和“...END...”之间插入以下代码:
/* USER CODE BEGIN 4 */
int fputc(int ch,FILE *f)
{
HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,10);
return ch;
}
/* USER CODE END 4 */
如果提示“error:unknown type name 'FILE'”错误,需要添加"stdio.h"头文件声明:
/* USER CODE BEGIN Includes */
#include "stdio.h"
二、测试KEY/LED/蜂鸣器/OLED显示/电机控制/编码输出
编译按键扫描程序和LED、蜂鸣器验证程序,验证KEY/LED电气连接及性能正常;
编译OLED液晶显示屏的I2C程序,验证OLED电气连接及性能正常;
编译左右电机Pwm输出、TB6612模块电机控制的电气连接正常、控制方向是否正确。代码如下:
/**************************************************************************
* 函数功能:右电机向前转动(反转)
**************************************************************************/
void Motor_R_Forward(void)
{
HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(AIN2_GPIO_Port,AIN2_Pin,GPIO_PIN_RESET);
}
/**************************************************************************
* 函数功能:右电机向后转动(正转)
**************************************************************************/
void Motor_R_Backward(void)
{
HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(AIN2_GPIO_Port,AIN2_Pin,GPIO_PIN_SET);
}
/**************************************************************************
* 函数功能:左电机向前转动(正转)
**************************************************************************/
void Motor_L_Forward(void)
{
HAL_GPIO_WritePin(BIN1_GPIO_Port,BIN1_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(BIN2_GPIO_Port,BIN2_Pin,GPIO_PIN_SET);
}
/**************************************************************************
* 函数功能:左电机向后转动(反转)
**************************************************************************/
void Motor_L_Backward(void)
{
HAL_GPIO_WritePin(BIN1_GPIO_Port,BIN1_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(BIN2_GPIO_Port,BIN2_Pin,GPIO_PIN_RESET);
}
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_3);//使能TIM2_CH3输出PWM信号(右电机)
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_4);//使能TIM2_CH4输出PWM信号(左电机)
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_3,2000);
Motor_R_Forward();//测试:使右电机向前转动
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_4,2000);
Motor_L_Forward();//测试:使左电机向前转动
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_3,3500);
Motor_R_Backward();//测试:使右电机向后转动
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_4,3500);
Motor_L_Backward();//测试:使左电机向后转动
测试左右电机编码器输出编码:设置左右电机向前转动(注意两个电机是左右安装,向前转动时两个是一正一反方向转动)时,编码器输出编码是否正常,均应是从0~65535向上计数(电路连接时将右电机A/B相反接),两个编码器计数进度基本相同。
测试时发现的问题:购买的电机器测试时发现相同Pwm值读取的编码值相差很大,查看电机编码盘时发现一个磁感应器距离较远,然后把感应器(元件)向中轴感应轮方向进行调整,问题解决。
HAL_TIM_Encoder_Start(&htim3,TIM_CHANNEL_ALL);//启动右电机编码器计数
HAL_TIM_Encoder_Start(&htim4,TIM_CHANNEL_ALL);//启动左电机编码器计数
encoder_R=__HAL_TIM_GET_COUNTER(&htim3); //测试:读取右电机编码器的值
encoder_L=__HAL_TIM_GET_COUNTER(&htim4); //测试:读取左电机编码器的值
printf("右电机编码器读数=%d ; 左电机编码器读数=%d\r\n",encoder_R,encoder_L);
三、 附件打包好的stm32CubeMX和MDK工程,包含OLED显示和KEY扫描库函数。烧录后初始化完成LED0常量,蜂鸣器短促鸣叫,左右电机向前转,KEY0/KEY1分别控制LED1的亮/灭,液晶屏顶行显示“The Device's OK! ”,右下角显示电源电压。