ES32F0654单片机的 ADC为12bit的逐次逼近型,最多可以测量16 个外部信号、两个内部参考电压和一个1/2 VDD 电压。通道的转换可选择单次、连续、扫描或不连续等采样模式,其采样结果存储在16 位数据寄存器,数据存储格式可以选择左对齐或右对齐存储。ADC 模块具有模拟看门狗特性,允许应用程序检测输入电压是否超过了用户设定的阈值上限或下限。
主要特点如下:
可配置的转换精度(6/8/10/12 位)
支持单次或连续工作模式
在标准转换、插入转换结束后以及发生模拟看门狗或溢出事件时产生中断
用于自动将通道0 转换为通道“n”的扫描模式
可配置的数据对齐方式
可独立设置各通道采样时间
可配置外部触发器选项,可为标准转换和插入转换配置极性
支持不连续采样模式
可配置的参考源选择
可配置的转换时钟分频
支持标准数据转换的DMA 请求标准
原理框图:
下面进行最简单的单通道单次转换实验。
#include "main.h"
#include "usart.h"
#include "md_usart.h"
#include "timer.h"
#include "exti.h"
#include "key.h"
#include "speed.h"
#include "md_adc.h"
#include "adc.h"
#include "stdio.h"
uint16_t key1_cnt=0;
uint16_t key2_cnt=0;
/**
* [url=home.php?mod=space&uid=247401]@brief[/url] This function configures GPIO
* @param None
* @retval None
*/
void config_gpio(void)
{
md_gpio_set_pin_function(LED1_GPIO_PORT, LED1_GPIO_PIN, GPIO_FUNC_1);
md_gpio_set_pin_push_pull(LED1_GPIO_PORT, LED1_GPIO_PIN);
md_gpio_set_pin_mode_output(LED1_GPIO_PORT, LED1_GPIO_PIN);
md_gpio_set_pin_function(LED2_GPIO_PORT, LED2_GPIO_PIN, GPIO_FUNC_1);
md_gpio_set_pin_push_pull(LED2_GPIO_PORT, LED2_GPIO_PIN);
md_gpio_set_pin_mode_output(LED2_GPIO_PORT, LED2_GPIO_PIN);
}
/**
* @brief Test main function
* @retval Status.
*/
extern uint16_t test;
float adc_value=0;
int main()
{
md_init_1ms_tick();
config_gpio();
usart_init();
timer_init();//定时器初始化
exti_init();//外部中断初始化
key_init();
/* Initialize adc pin */
adc_pin_init();//初始化ad口,PB0
/* Initialize ADC0 */
md_adc_struct_init(&h_adc);
md_adc_init(ADC0, &h_adc);//初始化adc
/* Initialize normal convert channel */
md_adc_set_normal_1st_conv_ns1(ADC0, ADC_NC_RANK_14);//设置通道,PB0对应14通道
md_adc_set_smpt1_cht(ADC0, ADC_SAMPLETIME_4);//设置采样时间
/* Enable ADC0 and start normal convert */
md_adc_converter_enable_adcen(ADC0);//使能ADC
while (1)
{
md_adc_set_normal_channel_conv_start_ichtrg(ADC0);//启动转换
/* Wait convert finish */
while (md_adc_get_stat_nche(ADC0) == 0);//等待转换完成
/* Read normal convert result */
nm_value = md_adc_get_normal_channel_val(ADC0); //获取转换结果
adc_value=5.0/4096*nm_value;//转换为电压值
printf("adc电压值:%.2fV\r\n\r\n",adc_value);//打印输出
md_delay_1ms(1000);
//send_str("usart0 test...");
}
}
/**
* @}
*/
/**
* @}
*/
输出结果:
|