STM32 G431RB + LM35 ADC的采样
在STM32 G431RB的板子上配置ADC对LM35温度传感器进行温度采样。
代码放到Github上 https://github.com/magicduan/demo_adc
STM32 Cube IDE 的ico文件的配置:
- 配置freertos OS
- PA6配置为PWM呼吸灯模式 (在面包板上加了一个LED等)
- 配置LED等是用来检测ADC能否工作
- PC5配置为ADC2_11
- LM35的vout连接到PC5管脚,Vs管脚连接到板子的5V,GND接GND
-
将Chanel 11配置为Single-ended
-
-
Clock Prescaler配置为divided by16。由于我配置的系统时钟是170MHZ,而ADC的最大配置时钟是14MHZ,所以我将这个Prescaler配置为divided by 16
Resolution就是采样对应的值范围,系统缺省的是12bit,这里我配置为10bit。也就是说最大值为2^10 = 1024,温度范围有限,你也可以配置为8bit,具体影响到做数值转换
配置好ICO后,生成代码。呼吸灯代码参考Demo_pwm的代码处理。
我先将PC5的ADC采样直接连接到PA5的LED管脚上,可以取得值,可能是采样频率相关,只能取得0和一个值。具体为什么不能取到不同的值没有去深究了。
然后我将ADC连接到LM35的Vout管脚进行温度采样。代码中用的简单的Polling模式。
main函数中进行Calibrate操作。
/* USER CODE BEGIN 2 */ HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); HAL_ADCEx_Calibration_Start(&hadc2,ADC_SINGLE_ENDED); /* USER CODE END 2 */
在StartDefaultTask中取得adc的值并通过串口输出
HAL_ADC_Start(&hadc2); HAL_ADC_PollForConversion(&hadc2,1); adc_res = HAL_ADC_GetValue(&hadc2); //temperature = adc_res*0.488; //5/1024*100 temperature = adc_res*0.3225; //3.3/1024*100 sprintf(buffer,"ADC Result = %d Tempareture = %f\n",adc_res,temperature); HAL_UART_Transmit(&hlpuart1,buffer,strlen(buffer)+1,1000); osDelay(5);
整个代码实现中碰到的坑有几个:
- ADC的采样频率最大为14MHZ,我的系统频率为170MHZ,所以需要加Prescaler
- LM35的工作电压为4v-30v,我用的板子上的5v,后来改用3.3v也可以正常工作,最终我还是选择了5v
- 将LM35的工作电压与ADC的采样电压搞混了,G431Rb的ADC采样电压是3.3v,工作电压设置为5v或者3.3v不影响采样的值。
- ADC采样值到温度的转换计算。
LM35是线性的。ADC的Resolution设置为10bit,也就是说当Vout = 参考电压3.3v 时,ADC的值是1023(2^10-1)。这样温度的转换方法就变为
temperature = adc_res(ADC的采样值)*3.3/1023*100 度
*刚开始错误的理解参考电压为LM35的工作电压(5v)这样计算出来的温度就太高了。
参考文章:
https://deepbluembedded.com/temperature-sensor-lm35-interfacing-with-pic-microcontrollers/
https://deepbluembedded.com/stm32-adc-tutorial-complete-guide-with-examples/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)