这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【换取手持数字示波器】基于AVR64DD32的温度监测报警设计

共1条 1/1 1 跳转至

【换取手持数字示波器】基于AVR64DD32的温度监测报警设计

助工
2025-02-01 17:07:52     打赏

感谢EEPW推出的“换取手持示波器”活动,本次分享的主题是:使用Microchip公司的新产品AVR64DD32的片上ADC来采集温度传感器数据,然后使用另外一个片上外设UART来传输温度数据到上位机电脑上。

Ft-5n5Uw8JxR_WB-zLdmKe7lUI3X

一、主控芯片:AVR64DD32简介

本次设计使用的板卡是AVR64DD32 Curiosity Nano开发板,板载了一个功能非常完善的8位单片机,并且外设资源也是非常丰富。

  • AVR64DD32微控制器

  • 一个黄色用户LED

  • 一个机械式用户开关

  • 一个32.768kHz晶体

  • 一个24MHz晶体

  • 板载调试器:

    • 一个绿色电源及状态指示LED

    • 编程和调试

    • 虚拟串行端口 (CDC)

    • 两个调试GPIO通道 (DGI GPIO)

  • USB供电

  • 可调目标电压:

    • MIC5353 LDO稳压器,由板载调试器控制

    • 输出电压范围:1.8V至5.1V(受USB输入电压限制)

    • 最大输出电流:500mA(受环境温度和输出电压限制)

板卡Pinout:

FqyV-R9BkxtrOYeGx3Q1VhfEALKs

项目目标:通过ADC采集温度传感器输出的模拟温度信号,如果温度超过预设值,通过板载LED0进行报警,与此同时,报警信息会通过UART模块进行上位机通知。下面介绍一个具体的实现:

二、温度传感器TMP235介绍

这款优秀的温度传感器来自知名的Adafruit,参考资料为:https://media.digikey.com/pdf/Data%20Sheets/Adafruit%20PDFs/4686_Web.pdf

FiZte6eF6_3X9cqCzN7ma0K7bUs_

这款温度传感器有三个引脚,分别是GND, VCC和模拟温度信号。其中,模块可以3v-5v供电,在外界温度为-50°C时,模拟温度信号的输出为0v;在外界温度为125°C时,模拟温度信号的输出为1.75v

此外,手册还提供了一个通过电压计算温度的公式: Temp °C = 100*(reading in V) - 50。因此,接下来通过ADC获取温度值后,可以方便的进行温度监测等后续功能开发。

 

三、片上模数转换器ADC配置

ADC的配置参考了Microchip官方提供的ADC例程,链接为:https://github.com/microchip-pic-avr-examples/avr64dd32-getting-started-with-adc-mplabx-mcc。 

由于温度传感器的输出电压范围在0v ~ 1.75v,因此将ADC的参考电压设置为2.048v可以满足要求。

在MCC图形化配置工具中打开VREF模块的配置界面,在Hardware Settings-> ADC Reference Source,以及ADC Reference Voltage选择内部2.048v电压源即可满足要求。

FkN4R4oCWPP5jf3_wL4x13IYwsP3

下面是VREF模块通过自动代码生成工具生成的配置代码:

int8_t VREF_Initialize(void)
{
   // ALWAYSON disabled; REFSEL Internal 1.024V reference;
   VREF.ACREF = 0x0;
   
   // ALWAYSON disabled; REFSEL Internal 2.048V reference;
   VREF.ADC0REF = 0x1;
   
   // ALWAYSON disabled; REFSEL Internal 1.024V reference;
   VREF.DAC0REF = 0x0;
   
return 0;
}

接下来需要配置ADC的具体参数:

  • 配置ADC为连续转换模式: Free Running Mode

  • ADC转换结果为10bit: Resolution Selection选择10-bit

  • 时钟源 外设时钟的1/4。

根据上述的设计要求,先使用MCC进行图形化配置:

Fq9pzCj4Nn04CazQKKpWMcLSade7

然后自动生成配置代码,代码如下:

int8_t ADC0_Initialize(void)
{
   
   // SAMPNUM No accumulation;
   ADC0.CTRLB = 0x0;
   // PRESC CLK_PER divided by 4;
   ADC0.CTRLC = 0x1;
   // INITDLY DLY0; SAMPDLY DLY0;
   ADC0.CTRLD = 0x0;
   // WINCM No Window Comparison;
   ADC0.CTRLE = 0x0;
   // DBGRUN disabled;
   ADC0.DBGCTRL = 0x0;
   // STARTEI disabled;
   ADC0.EVCTRL = 0x0;
   // RESRDY disabled; WCMP disabled;
   ADC0.INTCTRL = 0x0;
   // MUXPOS ADC input pin 18;
   ADC0.MUXPOS = 0x12;
   // MUXNEG ADC input pin 1;
   ADC0.MUXNEG = 0x1;
   // SAMPLEN 0;
   ADC0.SAMPCTRL = 0x0;
   // Window comparator high threshold
   ADC0.WINHT = 0x3FF;
   // Window comparator low threshold
   ADC0.WINLT = 0x0;
   // ENABLE enabled; FREERUN enabled; RESSEL 10-bit mode; RUNSTBY disabled; CONVMODE disabled; LEFTADJ disabled;
   ADC0.CTRLA = 0x7;
   return 0;
}

之后在主程序中调用如下接口即可获取ADC值:

adcVal = ADC0_GetConversion(ADC_MUXPOS_AIN18_gc);  
TempDegree = adcVal/5 - 50;

四、UART配置

板载Debugger的CDC TX,RX分别与AVR64DD32的PD5与PD4相连接。用户可以依照这个连接,在MCC图形化配置工具中把相关PIN分别设置为UART RX与TX,然后点击Generate即可生成UART模块的配置代码。

FvioPbdMEIJTowm392-etYHIF2Tx

 在MCC中的配置如下图所示。请勾选“Redirect Printf to UART”,这样生成的代码就支持直接在程序中通过Printf函数向串口工具打印调试信息,非常方便调试。

FjsFmGWYMbxbTyKuxuntHpSDgezy

下图是最终的效果展示截图:

  • 当温度超过20度的时候,通过ADC模块采集到的模拟温度值会通过UART模块发送至上位机,从而实现温度报警。

  • 当温度没有超过20度的时候,串口会打印出当前的温度以及所对应的ADC raw value.

FgB7J6ItKBek2kQYVdEq1IUMrM1t FqgN1AmNUfU3ci3P5ImgfIiBlA60

FkZdkR--P-ZYZpyHf0Y5V6BmzI8s

五、总结

本次分享的AVR64DD32虽然是一个8 bit单片机,但是MCC图形化配置界面,方便使用的各种外设模块都使得这款单片机更加易用,自动化代码生成大大节约了项目开发的时间,也保证了代码质量。


共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]