本帖最后由 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暂时没看到配置位置
- #include "mcc_generated_files/system/system.h"
- #include"mcc_generated_files/timer/delay.h"
- /*
- Main application
- */
- unsigned char i=0;
- unsigned char sw_flag=0;
- void sw_int_handler(void)
- {
- sw_flag++;
- }
- int main(void)
- {
- SYSTEM_Initialize();
- SW_SetInterruptHandler(sw_int_handler);
- printf("%02d Hello:%02d\n",i,sw_flag);
- Enable_global_interrupt();
- while(1)
- {
- i++;
- if(i>=100) i=0;
- DELAY_milliseconds(1000);
- ADC0_ConversionStart();
- YELLOW_LED_Toggle();
- if(sw_flag>0)
- {
- printf("%02d Hello:%02d\r\n",i,sw_flag);
- sw_flag=0;
- }
- else
- {
- // if(ADC0_IsConversionDone())
- {
- printf("ADC AIN0:%d----%x\r\n",ADC0_ConversionResultGet(),ADC0_ConversionResultGet());
- }
- }
- }
- }
编译测试,效果良好,修改为VDD作为参考电压
测试效果
经过查阅手册与生成的MCC文件,发现了配置内部参考电压的方法
注意到在MCC生成的库函数中包含了设置内部参考电压的方法的初始化函数
- int8_t VREF_Initialize(void)
- {
- // ADC0REFSEL Voltage reference at 0.55V; AC0REFSEL Voltage reference at 0.55V;
- VREF.CTRLA = 0x0;
-
- // ADC0REFEN disabled; AC0REFEN disabled;
- VREF.CTRLB = 0x0;
-
- return 0;
- }
只需要修改该函数即可实现内部参考电压的修改
与该设置相关的枚举变量在iom4809.h头文件中
- /* Voltage reference */
- typedef struct VREF_struct
- {
- register8_t CTRLA; /* Control A */
- register8_t CTRLB; /* Control B */
- } VREF_t;
- /* AC0 reference select */
- typedef enum VREF_AC0REFSEL_enum
- {
- VREF_AC0REFSEL_0V55_gc = (0x00<<0), /* Voltage reference at 0.55V */
- VREF_AC0REFSEL_1V1_gc = (0x01<<0), /* Voltage reference at 1.1V */
- VREF_AC0REFSEL_2V5_gc = (0x02<<0), /* Voltage reference at 2.5V */
- VREF_AC0REFSEL_4V34_gc = (0x03<<0), /* Voltage reference at 4.34V */
- VREF_AC0REFSEL_1V5_gc = (0x04<<0), /* Voltage reference at 1.5V */
- VREF_AC0REFSEL_AVDD_gc = (0x07<<0) /* AVDD */
- } VREF_AC0REFSEL_t;
- /* ADC0 reference select */
- typedef enum VREF_ADC0REFSEL_enum
- {
- VREF_ADC0REFSEL_0V55_gc = (0x00<<4), /* Voltage reference at 0.55V */
- VREF_ADC0REFSEL_1V1_gc = (0x01<<4), /* Voltage reference at 1.1V */
- VREF_ADC0REFSEL_2V5_gc = (0x02<<4), /* Voltage reference at 2.5V */
- VREF_ADC0REFSEL_4V34_gc = (0x03<<4), /* Voltage reference at 4.34V */
- VREF_ADC0REFSEL_1V5_gc = (0x04<<4) /* Voltage reference at 1.5V */
- } VREF_ADC0REFSEL_t;
既可以使用上述枚举变量来修改内部参考电压
|