请选择 进入手机版 | 继续访问电脑版
搜索
查看: 3059|回复: 0

[分享] 【STM32G491试用】+ADC及内部温度传感器测量

[复制链接]

该用户从未签到

14

主题

237

帖子

3

蝴蝶豆

金牌会员

最后登录
2023-1-28
发表于 2021-3-17 15:09:19 | 显示全部楼层 |阅读模式
今天我们做下G491的ADC及内部温度传感器的测试。来看看G491的ADC到底怎么样。麻蛋,在新论坛提交后,竟然说系统繁忙!!!!
56.png
白白浪费我一个小时,火大
G491的datasheet的说明上面提到了新增的4个PGA运放及可选的内部基准电压。
这样我们面对不同的采样电压,就可有多种方案了,well done!
A4.png
其次,ST终于舍得在64PIN封装上引出Vref了。之前在F103上面用64PIN封装,好纠结
没有外部基准电压输入引脚。这个坑终于填了。
在NUCLEO-G491RE demo板上,集成了TL431老牌稳压基准芯片,总算提示了下ADC的采样质量。
硬件相关图:

M1.jpg
M2.jpg
下面,我们开始用STM32CUBEMX配置程序:
我们先选择PA0为ADC1IN1的采样通道引脚,配置成模拟模式:
A1.png
开启独立通道1及内部温度传感器通道:
A2.png
对ADC进行配置(这里明显比之前多了PGA增益的设置:Gain Compensation,但我们默认为0,不使用):
A3.png
配置完毕,生成代码。
下面,我们添加我们的ADCIN1采样的代码(我们这里稍作修改,把采样通道变成可变的,但前提是初始化里面一定要有对应引脚):
  1. /* USER CODE BEGIN 1 */
  2. //获得ADC值
  3. //ch: 通道值 0~16,取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_16
  4. //返回值:转换结果
  5. u16 Get_Adc(u32 ch)   
  6. {
  7.         ADC_ChannelConfTypeDef ADC1_ChanConf;

  8.         ADC1_ChanConf.Channel=ch;                                   //通道
  9.         ADC1_ChanConf.Rank=ADC_REGULAR_RANK_1;                                       //第1个序列,序列1
  10.         ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_247CYCLES_5;        //采样时间
  11.         ADC1_ChanConf.SingleDiff = ADC_SINGLE_ENDED;
  12.         ADC1_ChanConf.OffsetNumber = ADC_OFFSET_NONE;
  13.         ADC1_ChanConf.Offset=0;                 
  14.         HAL_ADC_ConfigChannel(&hadc1,&ADC1_ChanConf);        //通道配置

  15.         HAL_ADC_Start(&hadc1);                               //开启ADC

  16.         HAL_ADC_PollForConversion(&hadc1,10);                //轮询转换

  17.         return (u16)HAL_ADC_GetValue(&hadc1);                //返回最近一次ADC1规则组的转换结果
  18. }
  19. //获取指定通道的转换值,取times次,然后平均
  20. //times:获取次数
  21. //返回值:通道ch的times次转换结果平均值
  22. u16 Get_Adc_Average(u32 ch,u8 times)
  23. {
  24.         u32 temp_val=0;
  25.         u8 t;
  26.         for(t=0;t<times;t++)
  27.         {
  28.                 temp_val+=Get_Adc(ch);
  29.                 delay_ms(5);
  30.         }
  31.         return temp_val/times;
  32. }
复制代码
下面我们重点说下,内部温度传感器的转换公式,是如何得出的:
我们先看ST官方给出的资料:
TS_CAL1和TS_CAL2为官方出厂就校准好的分别在30°和130°下的ADC值,需要读写FLASH操作。
M5.jpg
转换的公式:
M6.jpg
M7.jpg
但是这里,我们用它给出的典型值来计算,不读取上面的FLASH值。
M3.jpg
我们可以得出:
Votage=Add_data*Vref/4096;
temperate=(Votage-V30)/Avg_Slope + 30; //转换为温度值
下面我们开始写读取温度的代码:
  1. //得到温度值
  2. //返回值:温度值(扩大了100倍,单位:℃.)
  3. short Get_Temprate(void)
  4. {
  5.         u32 adcx;
  6.         short result;
  7.         double temperate;
  8.         adcx=Get_Adc_Average(ADC_CHANNEL_TEMPSENSOR_ADC1,10);//读取内部温度传感器通道,10次取平均
  9.         temperate=(float)adcx*(3.3/4096);                //电压值
  10.         temperate=(temperate-0.76)/0.0025 + 30; //转换为温度值
  11.         result=temperate*100;                                        //扩大100倍.
  12.         return result;
  13. }
复制代码
编译下载,查看串口输出:
SS1.png
经检测,ADC1IN1对应测试3.3V,ADC偶尔上下跳动一个单位,电压相差0.8mv;
3.3V/4096=0.8mv;与给出的几乎一致。
内部温度很温度几乎跳动很小。
//////////////////////////////////////////////
好了,ADC及内部温度测试就到这里。
谢谢大家!



回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-18 12:46 , Processed in 1.150945 second(s), 32 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表