任务目的
连接模拟信号输出的温度传感器,搭配AVR片内模拟比较器实现温度监控,当超过一定温度时报警。
设计思路
使用模拟输出的温度传感器接入主控芯片内部的模拟比较器正输入端。
使用内部的电压源,采用软件配置电压接入主控芯片内部的模拟比较器负输入端。
使用主控芯片内部的模拟比较器输出端输出到外部引脚,接到外部的蜂鸣器上。
本次项目开发,本质上是实现了一个模拟比较器的功能,因此本次项目也可使用比较器加电位器实现。
硬件介绍
主控板
特性:
- AVR64DD32微控制器
- 一个黄色用户LED
- 一个机械式用户开关
- 板载调试器:
-
一个绿色电源及状态指示LED
编程和调试
虚拟串行端口 (CDC)
两个调试GPIO通道 (DGI GPIO)
- 一个32.768kHz晶体
- 一个24MHz晶体
- USB供电
- 可调节的目标电压:
-
MIC5353 LDO稳压器,由板载调试器控制
输出电压范围:1.8V至5.1V(受USB输入电压限制)
最大输出电流:500mA(受环境温度和输出电压限制)
TMP235温度传感器
红色为3V至5V直流电源,黑色电线连接到地,白色导线连接到模拟输入。电压输出在-50°C时为0V,在125°C时则为1.75V。你可以很容易地计算温度电压单位为毫伏:温度°C=100*(读数单位为V)-50。
蜂鸣器
有源蜂鸣器,直接输入电压信号就可以发出声音。
配置框图
主要模块一览
配置IO复用框图
- 将PF5设置为输出(板载的LED小灯)
- 将PF6设置为输入(板载的按键)
- 将PD2设置为AC0功能的AINPx脚
- 将PA7设置为AC0功能的OUT脚
- 将PD4设置为USART0功能的TXD脚
- 将PD5设置为USART0功能的RXD脚
配置AC模块
- 失能AC模块
- 使用内部参考源
- 设置负输入为0.75V(实际为0.748V)
- 配置正输入引脚为第0号(实际对应PD2)
- 使能输出引脚(实际对应PA7)
- 不使用中断
配置VREF模块
- 设置VDD电压为3.3V
- 打开AC模块的参考电压输出
- 选择AC模块参考源为VDD
配置串口模块
- 开启串口0
- 配置比特率为115200(实际比特率为115942,偏差0.644%)
- 关闭奇偶校验
- 设置数据长度为8位
- 设置停止位为1位
- 设置不使用流控制
- 将串口0映射到printf打印函数上,方便操作
- 不使用中断
- 使能串口接收与串口发送
配置IO模块
- 重命名PF6为KEY,设置其上拉
- 重命名PF5为LED
最终配置的模块列表
主要代码
main文件
可以看到,除了调用SYSTEM_Initialize()初始化,以及while(1)死循环,完全没有写其他的代码。
#include "mcc_generated_files/system/system.h"
#include <util/delay.h>
/*
Main application
*/
int main(void)
{
SYSTEM_Initialize();
while(1)
{
}
}
初始化代码
此处初始化串口用于打印调试,正式代码并没有使用串口。
void SYSTEM_Initialize(void)
{
PIN_MANAGER_Initialize();
AC0_Initialize();
CLOCK_Initialize();
USART0_Initialize();
VREF_Initialize();
CPUINT_Initialize();
}
遇到的问题与解决办法
这个开发环境,真是折磨人,下载,更新就很慢,而且MCC启动更新,简直吐血。
断网后,不检查更新,使用起来流畅多了。
总结感想
板子很有趣,图像简化配置清晰明了,搞明白配置方式之后,完全不需要编写代码,直接就能完成项目所有的初始化代码,对于本次项目来说,直接不用编写代码,全部图形化配置,太方便了,外设的IO连线也很有趣,映射配置也很清晰,就是如果主控芯片的IO数量非常多,可能使用起来并不方便。
下次不要直接引用得捷官网的图片了,太慢,审核老是加载不出来。。。。。。。
意见建议
活动很好,希望下次模块不要限制的特别死,可以适当放宽一点。