查看: 225|回复: 7
收起左侧

[demo程序] NV32F10x 内部温度传感器测温示例(官方例程)

[复制链接]

27

主题

205

帖子

609

积分

高级技术员

 楼主| 发表于 2017-6-25 18:49 | 显示全部楼层 |返回版面||阅读模式
1.设计内容
通过使用 nv32f10x ADC 模块, 测量计算 MUC 工作时的温度。
1.软件设计流程图



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册 手机登录

x

27

主题

205

帖子

609

积分

高级技术员

 楼主| 发表于 2017-6-25 18:50 | 显示全部楼层 |返回版面
1.1 ADC 模块初始化与读数
ADC 初始化时, 为提高测量精度, ADC 时钟频率不能超过 1MHZ。 在读取 Bandgap 数值之前要对
PMC_SPMSC1 寄存器进行配置, 使能带隙缓冲区, 具体配置如下;
  1. void PMC_EnableBandgap(PMC_Type *pPMC)
  2. {
  3. pPMC->SPMSC1 |= PMC_SPMSC1_BGBE_MASK;
  4. }
复制代码

27

主题

205

帖子

609

积分

高级技术员

 楼主| 发表于 2017-6-25 18:51 | 显示全部楼层 |返回版面
1.2 计算当前电压值 VDD
当前电压值值计算公式如下;
VDD=ADCvd*Tbg/ADCbg;
ADCvd: VDD 对应的 ADC 满量程值, 由选择的转换模式决定, 当选择 10 位转化时 ADCvd 的值就是 2^10 -1。
ADCbg: ADC 读取的 Bandgap 值
Tbg: 为 Bandgap 的值,其取值范围为 1.1~1.8, 经典值为 1.135
注; 为提高测量温度精准度, Tbg 的值是可以微调的, 可通过电压测量当前实际输入值, 对 Tbg 的数值进行微调。

27

主题

205

帖子

609

积分

高级技术员

 楼主| 发表于 2017-6-25 18:51 | 显示全部楼层 |返回版面
1.3 计算温度传感器电压值 Vtemp
当前温度下, 温度传感器电压值计算公式如下所示;
Vtemp=ADCtemp*VDD/ADCvd
ADCtemp : ADC 读取当前温度下温度传感器通道的值。

27

主题

205

帖子

609

积分

高级技术员

 楼主| 发表于 2017-6-25 18:53 | 显示全部楼层 |返回版面
1.4 计算温度
计算当前温度 Temp 的公式如下所示;
Temp=25-(Vtemp25-Vtemp)/M
Vtemp25: 25 度时温度传感器对应的电压值, Vtemp25=1.419V。 当 Vtemp>Vtemp25 时表示当前温度低于 25 度, 当 Vtemp<Vtemp25 时表示当前温度高于 25 度
M: 温度相对电压变化率, 当温度大于 25 度时,M=-3.65mv/℃,当温度小于 25 度时 M=-3.4mv/℃

27

主题

205

帖子

609

积分

高级技术员

 楼主| 发表于 2017-6-25 18:54 | 显示全部楼层 |返回版面
1.5 例程
  1. int main (void)
  2. {
  3. float Vtemp,Temp,VDD;
  4. int32_t ADCbg;
  5. int32_t ADCtemp;
  6. float Tbg =1.118
  7. ADC_ConfigType sADC_Config = {0};
  8. sysinit()
  9. UART_WaitTxComplete(TERM_PORT);
  10. sADC_Config.u8ClockDiv = ADC_ADIV_DIVIDE_8; /* 初始化 ADC 模块 */
  11. sADC_Config.u8ClockSource = CLOCK_SOURCE_BUS_CLOCK;
  12. sADC_Config.u8Mode = ADC_MODE_10BIT;
  13. sADC_Config.sSetting.bLongSampleEn=1;
  14. ADC_Init( ADC, &sADC_Config);
  15. PMC_EnableBandgap(PMC); //使能带隙缓冲区
  16. ADCbg=ADC_PollRead(ADC,ADC_CHANNEL_AD23_BANDGAP);//读取带隙通道 ADC 值
  17. ADCtemp=ADC_PollRead(ADC,ADC_CHANNEL_AD22_TEMPSENSOR);//读取温度传感器通道
  18. ADC 值
  19. VDD=(float)(1023*1.111/ADCbg);//计算当前电压值
  20. Vtemp=(float)(ADCtemp*VDD/1023);//计算温度传感器电压值
  21. //Vtemp=(float)(ADCtemp*3.3/1023);
  22. /*计算当前温度值*/
  23. if (Vtemp>1.419)
  24. {
  25. Temp=25-((Vtemp-1.419)/0.0034);
  26. } e
  27. lse
  28. {
  29. Temp =25-((Vtemp-1.419)/0.00365);
  30. } p
  31. rintf("Vbg=%d,VDD=%f\n",ADCbg,VDD);
  32. printf ("ADCtemp=%d,Vtemp=%f,Temp=%f\n",ADCtemp,Vtemp,Temp);
  33. }
复制代码

11

主题

181

帖子

543

积分

高级技术员

发表于 2017-6-27 15:59 | 显示全部楼层 |返回版面
这样测量的温度误差有多大,精度是多少呢?

27

主题

121

帖子

363

积分

资深技术员

发表于 2017-6-29 17:40 | 显示全部楼层 |返回版面
haokeer 发表于 2017-6-27 15:59
这样测量的温度误差有多大,精度是多少呢?

在数据手册上没找到说明,精度应该不会很高
您需要登录后才可以回帖 登录 | 注册 手机登录

本版积分规则

关闭

热门推荐上一条 /2 下一条

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