[AT32F423] 【AT-START-F423测评】+ ADC测试

[复制链接]
 楼主| WoodData 发表于 2023-11-18 12:27 | 显示全部楼层 |阅读模式
AD, ADC, dc
本次测试使用ADC看看效果。还是用上扩展板,扩展板上有一个XY双轴的摇杆,使用的是电位器。
ADC引脚使用的是PA0和PA1.
adc初始化如下:
  1. void drv_adc_gpio_init(void)
  2. {
  3.     gpio_init_type gpio_initstructure;
  4.     adc_common_config_type  adc_common_struct;
  5.     adc_base_config_type    adc_base_struct;

  6.     crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  7.     crm_periph_clock_enable(CRM_ADC1_PERIPH_CLOCK, TRUE);
  8.     crm_adc_clock_select(CRM_ADC_CLOCK_SOURCE_HCLK);
  9.    
  10.     gpio_default_para_init(&gpio_initstructure);
  11.     /* config adc pin as analog input mode */
  12.     gpio_initstructure.gpio_mode = GPIO_MODE_ANALOG;
  13.     gpio_initstructure.gpio_pins = GPIO_PINS_0 | GPIO_PINS_1;
  14.     gpio_init(GPIOA, &gpio_initstructure);
  15.    
  16.     adc_common_default_para_init(&adc_common_struct);
  17.     /* config division,adcclk is division by hclk */
  18.     adc_common_struct.div = ADC_HCLK_DIV_4;
  19.     /* config inner temperature sensor and vintrv */
  20.     adc_common_struct.tempervintrv_state = FALSE;
  21.     adc_common_config(&adc_common_struct);
  22.    
  23.     adc_base_default_para_init(&adc_base_struct);
  24.     adc_base_struct.sequence_mode = TRUE;               //序列模式,TRUE=一个序列转换,false=只转换单一通道转换,设置多通道序列时也只转换第一个通道
  25.     adc_base_struct.repeat_mode = FALSE;                //重复模式,true=一次触发一直重复序列转换;false=一次触发只转换一次全序列
  26.     adc_base_struct.data_align = ADC_RIGHT_ALIGNMENT;   //右对齐
  27.     adc_base_struct.ordinary_channel_length = 2;        //2个普通通道
  28.     adc_base_config(ADC1, &adc_base_struct);
  29.     adc_resolution_set(ADC1, ADC_RESOLUTION_8B);    //转换位数8bit位
  30.     adc_occe_each_conversion_enable(ADC1,TRUE);     //true=使能每次转换都设置完成标志。false=序列内全部转换完成才置完成标志
  31.    
  32.     /* config ordinary channel */
  33.     adc_ordinary_channel_set(ADC1, ADC_CHANNEL_0, 1, ADC_SAMPLETIME_47_5);
  34.     adc_ordinary_channel_set(ADC1, ADC_CHANNEL_1, 2, ADC_SAMPLETIME_47_5);
  35.     /* config ordinary trigger source and trigger edge */
  36.     adc_ordinary_conversion_trigger_set(ADC1, ADC_ORDINARY_TRIG_SOFTWARE, ADC_ORDINARY_TRIG_EDGE_NONE);
  37.    
  38.     /* enable adc overflow interrupt */
  39.     adc_interrupt_enable(ADC1, ADC_OCCO_INT|ADC_OCCE_INT|ADC_PCCE_INT, TRUE);   //使能ADC标志中断
  40.    
  41.     /* adc enable */
  42.     adc_enable(ADC1, TRUE);
  43.     while(adc_flag_get(ADC1, ADC_RDY_FLAG) == RESET);   //等待ADC准备好
  44.    
  45.     nvic_irq_enable(ADC1_IRQn, 0, 0);   //使能ADC中断
  46.    
  47.     /* adc calibration */
  48.     adc_calibration_init(ADC1);
  49.     while(adc_calibration_init_status_get(ADC1));
  50.     adc_calibration_start(ADC1);
  51.     while(adc_calibration_status_get(ADC1));
  52.    
  53.     adc_ordinary_software_trigger_enable(ADC1, TRUE);   //启动软件触发转换
  54. }
使用普通序列转换模式。通过中断读取转换值。
  1. uint32_t adc_value[4];
  2. uint32_t adc_index = 0;
  3. void ADC1_IRQHandler(void)
  4. {
  5.     if(adc_flag_get(ADC1, ADC_OCCE_FLAG) != RESET)
  6.     {
  7.         adc_flag_clear(ADC1, ADC_OCCE_FLAG);
  8.         //转换完成
  9.         adc_value[adc_index ++ ] = adc_ordinary_conversion_data_get(ADC1);
  10.         if(adc_index == 2)  adc_index = 0;
  11.         
  12.     }
  13. }
在main函数中调用ADC初始化,然后将转换的adc值显示在液晶屏上。

  1. int main(void)
  2. {
  3.     volatile int32_t i=0;
  4.     int adxl_x,adxl_y,adxl_z;   //加速度
  5.     char buff[64];
  6.    
  7.     system_clock_config();
  8.     SysTick_Config(SystemCoreClock/1000);
  9.    
  10.     at32_led_init();
  11.     at32_button_init();
  12.     drv_usart_gpio_init(115200);
  13.     printf("at32f423 board print test.\r\n");
  14.    
  15.     printf("adxl id=%X \r\n",ADXL345_Init());
  16.    
  17.     spilcd_init();
  18.     Delay_ms(1);
  19.     Lcd_Clear(LCD_RED);
  20.     Delay_ms(1000);
  21.     Lcd_Clear(LCD_GREEN);
  22.     Delay_ms(1000);
  23.     Lcd_Clear(LCD_BLUE);
  24.     Delay_ms(1000);
  25.     Lcd_Clear(LCD_WHITE);
  26.     Delay_ms(1000);
  27.     Lcd_SetWindow(0,-LCD_W/2,-LCD_H/2,LCD_W,LCD_H);
  28.    
  29.     drv_adc_gpio_init();
  30.     while(1)
  31.     {
  32.         shell_usart_loop();
  33.         
  34.         ADXL345_GetXYZ(&adxl_x,&adxl_y,&adxl_z);
  35.         
  36. //        if(adxl_x>=0) printf("X=%d\t",adxl_x);
  37. //        else printf("X=-%d\t",~adxl_x + 1);
  38. //        if(adxl_y>=0) printf("Y=%d\t",adxl_y);
  39. //        else printf("Y=-%d\t",~adxl_y + 1);
  40. //        if(adxl_z>=0) printf("Z=%d\n",adxl_z);
  41. //        else printf("Z=-%d\n",~adxl_z + 1);
  42.         
  43.         Lcd_Fill(adxl_y-5,adxl_x-5,adxl_y+5,adxl_x+5,LCD_RED);
  44.         sprintf(buff,"x=%4d,y=%4d,z=%4d  ",adxl_x,adxl_y,adxl_z);
  45.         lcd_disp_str_at(-LCD_W/2,-LCD_H/2,buff);
  46.         
  47.         Lcd_Fill(adc_value[1]-5-LCD_W/2,adc_value[0]-5-LCD_H/2,adc_value[1]+5-LCD_W/2,adc_value[0]+5-LCD_H/2,LCD_BLUE);
  48.         sprintf(buff,"adc-x=%6d,adc-y=%6d  ",adc_value[1],adc_value[0]);
  49.         lcd_disp_str_at(-LCD_W/2,-LCD_H/2 + 30,buff);
  50.         
  51.         Delay_ms(10);
  52.         Lcd_Fill(adxl_y-5,adxl_x-5,adxl_y+5,adxl_x+5,LCD_WHITE);
  53.         Lcd_Fill(adc_value[1]-5-LCD_W/2,adc_value[0]-5-LCD_H/2,adc_value[1]+5-LCD_W/2,adc_value[0]+5-LCD_H/2,LCD_WHITE);
  54.         
  55.         adc_ordinary_software_trigger_enable(ADC1, TRUE);
  56.     }
  57. }











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

本版积分规则

127

主题

4784

帖子

28

粉丝
快速回复 返回顶部 返回列表