【东软载波ESF0654 PDS开发板活动】ADC

2020-03-08 19:20发布

ES32F0654单片机的 ADC为12bit的逐次逼近型,最多可以测量16 个外部信号、两个内部参考电压和一个1/2 VDD 电压。通道的转换可选择单次、连续、扫描或不连续等采样模式,其采样结果存储在16 位数据寄存器,数据存储格式可以选择左对齐或右对齐存储。ADC 模块具有模拟看门狗特性,允许应用程序检测输入电压是否超过了用户设定的阈值上限或下限。

主要特点如下:

可配置的转换精度(6/8/10/12 位)
支持单次或连续工作模式
在标准转换、插入转换结束后以及发生模拟看门狗或溢出事件时产生中断
用于自动将通道0 转换为通道“n”的扫描模式
可配置的数据对齐方式
可独立设置各通道采样时间
可配置外部触发器选项,可为标准转换和插入转换配置极性
支持不连续采样模式
可配置的参考源选择
可配置的转换时钟分频
支持标准数据转换的DMA 请求标准

原理框图:

捕获.PNG

下面进行最简单的单通道单次转换实验。
  1. #include "main.h"
  2. #include "usart.h"
  3. #include "md_usart.h"
  4. #include "timer.h"
  5. #include "exti.h"
  6. #include "key.h"
  7. #include "speed.h"
  8. #include "md_adc.h"
  9. #include "adc.h"
  10. #include "stdio.h"

  11. uint16_t key1_cnt=0;
  12. uint16_t key2_cnt=0;

  13. /**
  14.   * [url=home.php?mod=space&uid=247401]@brief[/url]  This function configures GPIO
  15.   * @param  None
  16.   * @retval None
  17.   */
  18. void config_gpio(void)
  19. {
  20.        
  21.         md_gpio_set_pin_function(LED1_GPIO_PORT, LED1_GPIO_PIN, GPIO_FUNC_1);
  22.         md_gpio_set_pin_push_pull(LED1_GPIO_PORT, LED1_GPIO_PIN);
  23.         md_gpio_set_pin_mode_output(LED1_GPIO_PORT, LED1_GPIO_PIN);
  24.        
  25.         md_gpio_set_pin_function(LED2_GPIO_PORT, LED2_GPIO_PIN, GPIO_FUNC_1);
  26.         md_gpio_set_pin_push_pull(LED2_GPIO_PORT, LED2_GPIO_PIN);
  27.         md_gpio_set_pin_mode_output(LED2_GPIO_PORT, LED2_GPIO_PIN);
  28. }

  29. /**
  30.   * @brief  Test main function
  31.   * @retval Status.
  32.   */
  33. extern uint16_t test;
  34. float adc_value=0;
  35. int main()
  36. {       
  37.        
  38.         md_init_1ms_tick();
  39.         config_gpio();
  40.         usart_init();
  41.         timer_init();//定时器初始化
  42.         exti_init();//外部中断初始化
  43.         key_init();
  44.        
  45.         /* Initialize adc pin */
  46.         adc_pin_init();//初始化ad口,PB0

  47.         /* Initialize ADC0 */
  48.         md_adc_struct_init(&h_adc);
  49.         md_adc_init(ADC0, &h_adc);//初始化adc

  50.         /* Initialize normal convert channel */
  51.         md_adc_set_normal_1st_conv_ns1(ADC0, ADC_NC_RANK_14);//设置通道,PB0对应14通道
  52.         md_adc_set_smpt1_cht(ADC0, ADC_SAMPLETIME_4);//设置采样时间
  53.        
  54.         /* Enable ADC0 and start normal convert */
  55.         md_adc_converter_enable_adcen(ADC0);//使能ADC
  56.        
  57.        
  58.         while (1)
  59.         {
  60.         md_adc_set_normal_channel_conv_start_ichtrg(ADC0);//启动转换
  61.        
  62.         /* Wait convert finish */
  63.         while (md_adc_get_stat_nche(ADC0) == 0);//等待转换完成
  64.        
  65.         /* Read normal convert result */
  66.         nm_value = md_adc_get_normal_channel_val(ADC0);        //获取转换结果
  67.         adc_value=5.0/4096*nm_value;//转换为电压值
  68.                 printf("adc电压值:%.2fV ",adc_value);//打印输出
  69.                 md_delay_1ms(1000);
  70.                 //send_str("usart0 test...");
  71.         }
  72. }

  73. /**
  74.   * @}
  75.   */
  76. /**
  77.   * @}
  78.   */
复制代码
输出结果:

捕获2.PNG


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。