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
",adc_value);//打印输出
- md_delay_1ms(1000);
- //send_str("usart0 test...");
- }
- }
- /**
- * @}
- */
- /**
- * @}
- */
复制代码
输出结果:
一周热门 更多>