你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】stm32Cubemx实用篇(三):DAC电压输出和ADC电压检测以及内部温度传感器测温

[复制链接]
STMCU小助手 发布时间:2022-3-8 22:16
一、Cubemx工程配置
1、时钟配置

H1_7SPQZ)PBXNZY4ZGSM~6O.png

2、DAC设置

具体设置如下图所示:
))6NTLWVSX`Q_F])CDLO91I.png

3、ADC设置

这里需要注意的一点是:Sampling Time(采样周期)设置越长采集到的电压越准,同时耗费的时间越长。可以根据需要选择自己需要的周期。

具体设置如下图所示:

0CT7`KV9I1IT95H4RP]7ZPO.png

二、实验
1.ADC采集电压函数

需要注意的一点:打开ADC后不能立即读取,需要延时一段时间 ADC读取步骤: 1、打开ADC中断 2、延时一段时间 3、读取ADC值 4、停止ADC中断
代码如下(示例):

  1. uint16_t Get_ADC_Value(ADC_HandleTypeDef hadc,uint8_t times)
  2. {
  3.         if(times>=30)
  4.         {
  5.                 return 0;
  6.         }
  7.     uint16_t        adc_value_final=0;
  8.         uint32_t        adc_value=0;
  9.           HAL_ADC_Start_IT(&hadc);   //打开ADC1
  10.         HAL_Delay(10);   //打开ADC后不能立即读取,需要延时一段时间
  11.         for(int i=0;i<times;i++)
  12.         {
  13.                 adc_value += HAL_ADC_GetValue(&hadc);  
  14.         }
  15.         adc_value_final=(uint16_t)(adc_value/times);
  16.         HAL_ADC_Stop_IT(&hadc);  //关闭ADC1
  17.         return adc_value_final;
  18. }

复制代码

2.主函数功能
这里在主函数增加了按键扫描函数,按键1每按下一次DAC输出电压就增加0.1V,按键2每按下一次DAC输出电压就减少0.1V。另外还增加了串口printf函数,打印出DAC输出电压和ADC读取到的电压值。

代码如下(示例):

  1. key=KEYPRESS();    //按键扫描
  2.                 if(key==1)//按键1按下
  3.                 {
  4.                         if(temp<=3.2f)
  5.                         {
  6.                                 temp+=0.1f;
  7.                                 HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_1,DAC_ALIGN_12B_R,(uint32_t)(temp*4096/3.3f));  
  8.                                 printf("Set Voltage:%d=%.1fV\n",(uint32_t)(temp*4096/3.3f),temp);
  9.                         }               
  10.                         adc_value=Get_ADC_Value(hadc1,10);
  11.                         printf("ADCVALUE = %d, ADCVALUE(V) = %fV\r\n",adc_value,adc_value*3.3/65535);  
  12.                                 
  13.                 }
  14.                 if(key==2)//按键2按下
  15.                 {
  16.                         if(temp>=0.1f)
  17.                         {
  18.                                 HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_1,DAC_ALIGN_12B_R,(uint32_t)(temp*4096/3.3f));  
  19.                                 printf("Set Voltage:%.1f\n",temp);
  20.                         }               
  21.                         adc_value=Get_ADC_Value(hadc1,10);
  22.                         printf("ADCVALUE = %d, ADCVALUE(V) = %fV\r\n",adc_value,adc_value*3.3/65535);  
  23.                         
  24.                 }        
复制代码

最终可以在串口看到正确的实验现象,如下图:

A8UX1J)FM[)SKDQAGCRFUCA.png

三、内部温度传感器实验
1.参数设置

注意:不要忘记打开ADC3的通道中断

AT5D~V~D%8@BE1~MVGSSRC5.png

2.函数功能实现
首先要进行ADC校准以及要打开ADC通道。
代码如下(示例):

  1.   /* USER CODE BEGIN 2 */

  2. //校准ADC
  3. HAL_ADCEx_Calibration_Start(&hadc3,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED);  //打开ADC3
  4. HAL_ADC_Start(&hadc3);  
  5. /* USER CODE END 2 */
  6.                         
  7. }   
复制代码

  
其次进行AD采集以及开始运用公式进行转换。
代码如下(示例):

  1. HAL_ADC_Start(&hadc3);
  2. adc_v = HAL_ADC_GetValue(&hadc3);
  3. adcx = (110.0-30.0)/(*(unsigned short*)(0x1FF1E840) - *(unsigned short*)(0x1FF1E820));
  4. temp = adcx*(adc_v - *(unsigned short*)(0x1FF1E820))+30;
  5. //temp为最终的温度值
复制代码


最终温度测试结果如下:
C98{G{3XL`0BH94~N6D(6.png

















收藏 评论0 发布时间:2022-3-8 22:16

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版