[国产单片机] 【东软载波ESF0654 PDS开发板活动】ADC及PWM调光测试

[复制链接]
1151|0
 楼主| hbzjt2011 发表于 2019-12-16 19:48 | 显示全部楼层 |阅读模式

【东软载波ESF0654 PDS开发板活动】ADC及PWM调光测试

今天测试了板子的ADC功能及PWM调光功能,主要实现了根据ADC采集的板载电位器的值来使用PWM功能调节导光板的亮度。

      ES32F0654LT集成的支持 1 路模数转换器(ADC0)。ADC(Analog to Digital Convertor)是 12 位分辨率的逐次逼近型模数转换器。它具有多达 19 个复用通道,可测量从管脚输入的 16 个外部信号、3 个内部信号。这些通道的模数转换可在单次、连续、扫描或不连续采样模式下进

行。ADC 的结果存储在一个左对齐或右对齐的 16 位数据寄存器中。

ESF0654 PDS开发板ADC接在PB0接口,PB0为ADC0的14通道。

IO引脚配置如下:

  1. static void adc_pin_init(void)
  2. {
  3.     /* Initialize ADC pin */
  4.     gpio_init_t x;

  5.     /* Initialize PB0 pin */
  6.     x.mode = GPIO_MODE_INPUT;
  7.     x.odos = GPIO_PUSH_PULL;
  8.     x.pupd = GPIO_PUSH_UP;
  9.     x.odrv = GPIO_OUT_DRIVE_NORMAL;
  10.     x.flt  = GPIO_FILTER_DISABLE;
  11.     x.type = GPIO_TYPE_TTL;
  12.     x.func = GPIO_FUNC_0;
  13.     ald_gpio_init(GPIOB, GPIO_PIN_0, &x);

  14.     return;
  15. }

ADC0的配置如下:

  1. void adc_init(void)
  2. {
  3.     /* clear lpuart_handle_t structure */
  4.     memset(&h_adc, 0x0, sizeof(adc_handle_t));
  5.     /* clear adc_nch_conf_t structure */
  6.     memset(®_config, 0x0, sizeof(adc_nch_conf_t));

  7.     adc_pin_init();

  8.     /* Initialize adc */
  9.     h_adc.perh = ADC0;
  10.     h_adc.init.data_align = ADC_DATAALIGN_RIGHT;
  11.     h_adc.init.scan_mode  = DISABLE;
  12.     h_adc.init.cont_mode  = DISABLE;
  13.     h_adc.init.nch_len    = ADC_NCH_LEN_1;
  14.     h_adc.init.disc_mode  = ADC_ALL_DISABLE;
  15.     h_adc.init.disc_nbr   = ADC_DISC_NBR_1;
  16.     h_adc.init.conv_res   = ADC_CONV_RES_10;
  17.     h_adc.init.clk_div    = ADC_CKDIV_128;
  18.     h_adc.init.neg_ref    = ADC_NEG_REF_VSS;
  19.     h_adc.init.pos_ref    = ADC_POS_REF_VDD;

  20.     ald_adc_init(&h_adc);

  21.     /* Initialize regular convert channel */
  22.     reg_config.channel       = ADC_CHANNEL_14;
  23.     reg_config.rank          = ADC_NCH_RANK_1;
  24.     reg_config.samp_time     = ADC_SAMPLETIME_4;
  25.     ald_adc_normal_channel_config(&h_adc, ®_config);

  26.     return;
  27. }

      ES32F0654LT集成通用定时器(GP16C2T)包含一个 16 位自动重载计数器,该计数器由可配置的预分频器驱动。支持 2 路通用定时器(GP16C2T0,GP16C2T1) 。GP16C2T 包含 2 个独立通道。 通用定时器(GP16C2T) 的用途广泛,可测量信号脉冲长度(输入捕获)或输出脉冲波形 (比较输出、PWM 及带死区时间插入的互补 PWM)。

本程序中使用了TIM3的1通道,对应引脚为PC6。

IO引脚初始化如下,对应IO的功能3:

  1. static void tim3_pin_init(void)
  2. {
  3.     gpio_init_t GPIO_InitStructure;

  4.     /* Initialize tim0 ch1 pin */
  5.     GPIO_InitStructure.mode = GPIO_MODE_OUTPUT;
  6.     GPIO_InitStructure.odos = GPIO_PUSH_PULL;
  7.     GPIO_InitStructure.pupd = GPIO_PUSH_UP;
  8.     GPIO_InitStructure.odrv = GPIO_OUT_DRIVE_NORMAL;
  9.     GPIO_InitStructure.flt  = GPIO_FILTER_DISABLE;
  10.     GPIO_InitStructure.type = GPIO_TYPE_TTL;
  11.     GPIO_InitStructure.func = GPIO_FUNC_3;

  12.     ald_gpio_init(GPIOC, GPIO_PIN_6, &GPIO_InitStructure);

  13. }

TIM3初始化程序如下:

  1. void tim3_init(timer_handle_t *tim_h, timer_oc_init_t *tim_ocinit, timer_clock_config_t *tim_clock)
  2. {
  3.     /* Initialize pin */
  4.     tim3_pin_init();

  5.     /* Initialize TIM3 */
  6.     tim_h->perh              = GP16C2T1;
  7.     tim_h->init.prescaler    = 0;
  8.     tim_h->init.mode         = TIMER_CNT_MODE_UP;
  9.     tim_h->init.period       = (uint32_t)(255 - 1);
  10.     tim_h->init.clk_div      = TIMER_CLOCK_DIV1;
  11.     tim_h->init.re_cnt       = 0;
  12.     ald_timer_pwm_init(tim_h);

  13.     /* Initialize clock source */
  14.     tim_clock->source = TIMER_SRC_INTER;
  15.     ald_timer_config_clock_source(tim_h, tim_clock);

  16.     /* Common configuration for all channels */
  17.     tim_ocinit->oc_mode        = TIMER_OC_MODE_PWM1;
  18.     tim_ocinit->oc_polarity    = TIMER_OC_POLARITY_HIGH;
  19.     tim_ocinit->oc_fast_en     = DISABLE;
  20.     tim_ocinit->ocn_polarity   = TIMER_OCN_POLARITY_HIGH;
  21.     tim_ocinit->ocn_idle       = TIMER_OCN_IDLE_RESET;
  22.     tim_ocinit->oc_idle        = TIMER_OC_IDLE_RESET;

  23.     /* Set the pulse value for channel 1 */
  24.     tim_ocinit->pulse = (uint32_t)(255 * 20 / 100);
  25.     ald_timer_oc_config_channel(tim_h, tim_ocinit, TIMER_CHANNEL_1);

  26.     /* Set the pulse value for channel 2 */
  27.     tim_ocinit->pulse = (uint32_t)(255 * 50 / 100);
  28.     ald_timer_oc_config_channel(tim_h, tim_ocinit, TIMER_CHANNEL_2);

  29.     /* Start input pwm from tim2/3 channel 1 */
  30.     ald_timer_oc_start(tim_h, TIMER_CHANNEL_1);

  31. }

主程序实现了根据ADC采用进行PWM调节控制外部导光板的亮度:

  1.   /* ADC测试 */
  2.                 value = adc_average();
  3.                 sprintf((char *)tx_buf, "ADC_Value: %d \n", value);
  4.                 ald_uart_send(&h_uart, tx_buf, sizeof("ADC_Value: %d \n"), 1000);               
  5.                
  6.                 /* TIM3 PWM测试 */
  7.                 duty = value/32.72;
  8.                 if(duty <= 1)
  9.                         duty = 1;
  10.                 ald_timer_pwm_set_duty(&tim3.tim_h, TIMER_CHANNEL_1, (uint16_t)duty);

实现现象如下:



本帖子中包含更多资源

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

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:欢迎参与LabVIEW版块的讨论学习! 点我一键即达

339

主题

2935

帖子

45

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