本人使用的设备/驱动:
使用stm32f103rct6,准备使用ADC实现电池电压检测
本文直接从项目中加入相关功能说起,环境以及其他外设配置:
使用ST-LINK utility将单片机中的程序下载下来
CubeMX配合PlatformIO开发STM32,配置环境,点亮LED灯
CubeMX配合PlatformIO开发STM32,配置usart实现串口通讯
CubeMX配合PlatformIO开发STM32,配置ADC实现电池电压检测
CubeMX配合PlatformIO开发STM32,配置MPU6050(I2C)
CubeMX配合PlatformIO开发STM32,配置双MPU6050(板载与外置),并使用gui显示数据
CubeMX配合PlatformIO开发STM32,通过系统时钟(systick)中断让不同功能代码以不同频率执行,计算计算所花时间
CubeMX配合PlatformIO开发STM32,实现pid算法控制电机的转角
CubeMX配合PlatformIO开发STM32,配置定时器,实现SPWM算法控制电机
CubeMX配合PlatformIO开发STM32,配置uart中断,配合python的gui在线调参
查询原理图,可知使用PA5引脚检测分压过的电池电压信号:
在CubeMX中选择PA5引脚,选择GPIO_analog,并设置为ADC2_IN5
然后在clock configuration中将adc时钟信号更改至9MHz
然后打开pio,添加adc临时存储变量:
/* USER CODE BEGIN PV */
uint16_t ADC2_Value = 0;
/* USER CODE END PV */
在while中加入:
HAL_ADC_Start(&hadc2);//Start ADC conversion
HAL_ADC_PollForConversion(&hadc2, 50);//表示等待转换完成,第二个参数表示超时时间,单位ms.
/* Check if the continous conversion of regular channel is finished */
if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc2), HAL_ADC_STATE_REG_EOC)) //换取ADC状态,HAL_ADC_STATE_REG_EOC表示转换完成标志位,转换数据可用
{
/*##-3- Get the converted value of regular channel ######################*/
ADC2_Value = HAL_ADC_GetValue(&hadc2);//获取ADC测量值
printf("Voltage: %1.3f V \r\n",ADC2_Value*0.0061767578125); //分压还原0.00617=3.3/4096*11.5/1.5
}
但是这个时候还不能通过printf来串口打印代码,因为默认的printf是打印到屏幕上的,我们要重定向到串口
打开usart.c,拉到最下方,在用户自定代码中添加:
/* USER CODE BEGIN 1 */
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
* @brief Retargets the C library printf function to the USART.
* @param None
* @retval None
*/
PUTCHAR_PROTOTYPE
{
/* Place your implementation of fputc here */
/* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
HAL_UART_Transmit(&huart3, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
/* USER CODE END 1 */
这个时候就重定向完成了。
但是这个时候烧录的话,你会发现无法打印浮点数(
打开platform.ini添加
; for printf float
build_flags = -Wl,-u,_printf_float,-u,_scanf_float
这个时候烧录,就可以在串口得到浮点数输出了