[PIC®/AVR®/dsPIC®产品] ATMEGA4809的ADC在MCC下的使用方法

[复制链接]
 楼主| gaoyang9992006 发表于 2025-1-20 18:09 | 显示全部楼层 |阅读模式
本帖最后由 gaoyang9992006 于 2025-1-21 14:36 编辑

本节内容需要使用uart打印信息,关于uart的使用参考下面链接的帖子
https://bbs.21ic.com/icview-3427358-1-1.html
新建工程项目

关于IO的使用为板载LED和按钮,IO配置如下

上述配置好随时可以用于测试和指示灯。也可以巩固之前几个帖子中的内容
接下面启用ADC

时钟选择
系统时钟默认是内部高速时钟,可通过配置位设置为16MHz或20MHz,设置为16MHz可以方便分频出整数主频时钟

当时钟配置到16MHz时候,串口的波特率设置在9600就没有误差了。

开发板的引脚图上给的有ADC使用的引脚,实际可选的更多

我们先用默认的这个AIN0

配置上采用默认的配置,先进行测试

ADC的结构如下图所示

具备可选的3个参考电压
内部参考电压貌似可以配置

不过在MCC暂时没看到配置位置
  1. #include "mcc_generated_files/system/system.h"
  2. #include"mcc_generated_files/timer/delay.h"
  3. /*
  4.     Main application
  5. */
  6. unsigned char i=0;
  7. unsigned char sw_flag=0;

  8. void sw_int_handler(void)
  9. {
  10.     sw_flag++;
  11. }
  12. int main(void)
  13. {
  14.     SYSTEM_Initialize();
  15.     SW_SetInterruptHandler(sw_int_handler);
  16.     printf("%02d Hello:%02d\n",i,sw_flag);
  17.     Enable_global_interrupt();
  18.     while(1)
  19.     {
  20.         i++;
  21.         if(i>=100) i=0;
  22.         DELAY_milliseconds(1000);
  23.         ADC0_ConversionStart();
  24.         YELLOW_LED_Toggle();
  25.         if(sw_flag>0)
  26.         {
  27.             printf("%02d Hello:%02d\r\n",i,sw_flag);
  28.             sw_flag=0;
  29.         }
  30.         else
  31.         {
  32.            // if(ADC0_IsConversionDone())
  33.             {
  34.                 printf("ADC AIN0:%d----%x\r\n",ADC0_ConversionResultGet(),ADC0_ConversionResultGet());
  35.             }
  36.         }
  37.     }   
  38. }
编译测试,效果良好,修改为VDD作为参考电压

测试效果
经过查阅手册与生成的MCC文件,发现了配置内部参考电压的方法

注意到在MCC生成的库函数中包含了设置内部参考电压的方法的初始化函数
  1. int8_t VREF_Initialize(void)
  2. {
  3.     // ADC0REFSEL Voltage reference at 0.55V; AC0REFSEL Voltage reference at 0.55V;
  4.     VREF.CTRLA = 0x0;
  5.    
  6.     // ADC0REFEN disabled; AC0REFEN disabled;
  7.     VREF.CTRLB = 0x0;


  8.         
  9.         return 0;
  10. }
只需要修改该函数即可实现内部参考电压的修改
与该设置相关的枚举变量在iom4809.h头文件中
  1. /* Voltage reference */
  2. typedef struct VREF_struct
  3. {
  4.     register8_t CTRLA;  /* Control A */
  5.     register8_t CTRLB;  /* Control B */
  6. } VREF_t;

  7. /* AC0 reference select */
  8. typedef enum VREF_AC0REFSEL_enum
  9. {
  10.     VREF_AC0REFSEL_0V55_gc = (0x00<<0),  /* Voltage reference at 0.55V */
  11.     VREF_AC0REFSEL_1V1_gc = (0x01<<0),  /* Voltage reference at 1.1V */
  12.     VREF_AC0REFSEL_2V5_gc = (0x02<<0),  /* Voltage reference at 2.5V */
  13.     VREF_AC0REFSEL_4V34_gc = (0x03<<0),  /* Voltage reference at 4.34V */
  14.     VREF_AC0REFSEL_1V5_gc = (0x04<<0),  /* Voltage reference at 1.5V */
  15.     VREF_AC0REFSEL_AVDD_gc = (0x07<<0)  /* AVDD */
  16. } VREF_AC0REFSEL_t;

  17. /* ADC0 reference select */
  18. typedef enum VREF_ADC0REFSEL_enum
  19. {
  20.     VREF_ADC0REFSEL_0V55_gc = (0x00<<4),  /* Voltage reference at 0.55V */
  21.     VREF_ADC0REFSEL_1V1_gc = (0x01<<4),  /* Voltage reference at 1.1V */
  22.     VREF_ADC0REFSEL_2V5_gc = (0x02<<4),  /* Voltage reference at 2.5V */
  23.     VREF_ADC0REFSEL_4V34_gc = (0x03<<4),  /* Voltage reference at 4.34V */
  24.     VREF_ADC0REFSEL_1V5_gc = (0x04<<4)  /* Voltage reference at 1.5V */
  25. } VREF_ADC0REFSEL_t;
既可以使用上述枚举变量来修改内部参考电压

本帖子中包含更多资源

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

×
小灵通2018 发表于 2025-1-25 16:49 | 显示全部楼层
第一次遇到内部参考电压可以配置的,真是太棒了。
598330983 发表于 2025-1-25 16:50 | 显示全部楼层
很好奇,这个参考电压可以在运行中修改吗?比如测量不到参考电压的一半,为了提高测量精度,降低参考电压?
antusheng 发表于 2025-1-25 16:51 | 显示全部楼层
598330983 发表于 2025-1-25 16:50
很好奇,这个参考电压可以在运行中修改吗?比如测量不到参考电压的一半,为了提高测量精度,降低参考电压? ...

没说不可以,应该就是可以,如果不可以修改的,一般都是在配置位定义的,程序里的都可以改动
wanduzi 发表于 2025-1-25 16:52 | 显示全部楼层
一般也有这么应用,那个4.34V的电压需要供电5V才可以吧?
wanduzi 发表于 2025-1-25 16:53 | 显示全部楼层
好像每个功能都设置了2个控制寄存器字节。
幸福小强 发表于 2025-1-25 16:59 | 显示全部楼层
内部时钟还可配置速度。
稳稳の幸福 发表于 2025-1-26 17:57 | 显示全部楼层
支持中断触发吗?
598330983 发表于 2025-1-26 18:57 | 显示全部楼层
antusheng 发表于 2025-1-25 16:51
没说不可以,应该就是可以,如果不可以修改的,一般都是在配置位定义的,程序里的都可以改动 ...

嗯,是的,这样可以提高测量精度。
598330983 发表于 2025-1-26 18:58 | 显示全部楼层
可以默认配置最高的那个,如果不足谋几个值,就逐步调整低
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2046

主题

16351

帖子

221

粉丝
快速回复 在线客服 返回列表 返回顶部