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

本次测试使用ADC看看效果。还是用上扩展板,扩展板上有一个XY双轴的摇杆,使用的是电位器。
ADC引脚使用的是PA0和PA1.
adc初始化如下:

复制

void drv_adc_gpio_init(void)

{

    gpio_init_type gpio_initstructure;

    adc_common_config_type  adc_common_struct;

    adc_base_config_type    adc_base_struct;



    crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);

    crm_periph_clock_enable(CRM_ADC1_PERIPH_CLOCK, TRUE);

    crm_adc_clock_select(CRM_ADC_CLOCK_SOURCE_HCLK);

    

    gpio_default_para_init(&gpio_initstructure);

    /* config adc pin as analog input mode */

    gpio_initstructure.gpio_mode = GPIO_MODE_ANALOG;

    gpio_initstructure.gpio_pins = GPIO_PINS_0 | GPIO_PINS_1;

    gpio_init(GPIOA, &gpio_initstructure);

    

    adc_common_default_para_init(&adc_common_struct);

    /* config division,adcclk is division by hclk */

    adc_common_struct.div = ADC_HCLK_DIV_4;

    /* config inner temperature sensor and vintrv */

    adc_common_struct.tempervintrv_state = FALSE;

    adc_common_config(&adc_common_struct);

    

    adc_base_default_para_init(&adc_base_struct);

    adc_base_struct.sequence_mode = TRUE;               //序列模式,TRUE=一个序列转换,false=只转换单一通道转换,设置多通道序列时也只转换第一个通道

    adc_base_struct.repeat_mode = FALSE;                //重复模式,true=一次触发一直重复序列转换;false=一次触发只转换一次全序列

    adc_base_struct.data_align = ADC_RIGHT_ALIGNMENT;   //右对齐

    adc_base_struct.ordinary_channel_length = 2;        //2个普通通道

    adc_base_config(ADC1, &adc_base_struct);

    adc_resolution_set(ADC1, ADC_RESOLUTION_8B);    //转换位数8bit位

    adc_occe_each_conversion_enable(ADC1,TRUE);     //true=使能每次转换都设置完成标志。false=序列内全部转换完成才置完成标志

    

    /* config ordinary channel */

    adc_ordinary_channel_set(ADC1, ADC_CHANNEL_0, 1, ADC_SAMPLETIME_47_5);

    adc_ordinary_channel_set(ADC1, ADC_CHANNEL_1, 2, ADC_SAMPLETIME_47_5);

    /* config ordinary trigger source and trigger edge */

    adc_ordinary_conversion_trigger_set(ADC1, ADC_ORDINARY_TRIG_SOFTWARE, ADC_ORDINARY_TRIG_EDGE_NONE); 

    

    /* enable adc overflow interrupt */

    adc_interrupt_enable(ADC1, ADC_OCCO_INT|ADC_OCCE_INT|ADC_PCCE_INT, TRUE);   //使能ADC标志中断

    

    /* adc enable */

    adc_enable(ADC1, TRUE);

    while(adc_flag_get(ADC1, ADC_RDY_FLAG) == RESET);   //等待ADC准备好

    

    nvic_irq_enable(ADC1_IRQn, 0, 0);   //使能ADC中断

    

    /* adc calibration */

    adc_calibration_init(ADC1);

    while(adc_calibration_init_status_get(ADC1));

    adc_calibration_start(ADC1);

    while(adc_calibration_status_get(ADC1));

    

    adc_ordinary_software_trigger_enable(ADC1, TRUE);   //启动软件触发转换

}

使用普通序列转换模式。通过中断读取转换值。

复制

uint32_t adc_value[4];

uint32_t adc_index = 0;

void ADC1_IRQHandler(void)

{

    if(adc_flag_get(ADC1, ADC_OCCE_FLAG) != RESET)

    {

        adc_flag_clear(ADC1, ADC_OCCE_FLAG);

        //转换完成

        adc_value[adc_index ++ ] = adc_ordinary_conversion_data_get(ADC1);

        if(adc_index == 2)  adc_index = 0;

        

    }

}

在main函数中调用ADC初始化,然后将转换的adc值显示在液晶屏上。
 

复制

int main(void)

{

    volatile int32_t i=0;

    int adxl_x,adxl_y,adxl_z;   //加速度

    char buff[64];

    

    system_clock_config();

    SysTick_Config(SystemCoreClock/1000);

    

    at32_led_init();

    at32_button_init();

    drv_usart_gpio_init(115200);

    printf("at32f423 board print test.\r\n");

    

    printf("adxl id=%X \r\n",ADXL345_Init());

    

    spilcd_init();

    Delay_ms(1);

    Lcd_Clear(LCD_RED);

    Delay_ms(1000);

    Lcd_Clear(LCD_GREEN);

    Delay_ms(1000);

    Lcd_Clear(LCD_BLUE);

    Delay_ms(1000);

    Lcd_Clear(LCD_WHITE);

    Delay_ms(1000);

    Lcd_SetWindow(0,-LCD_W/2,-LCD_H/2,LCD_W,LCD_H);

    

    drv_adc_gpio_init();

    while(1)

    {

        shell_usart_loop();

        

        ADXL345_GetXYZ(&adxl_x,&adxl_y,&adxl_z);

        

//        if(adxl_x>=0) printf("X=%d\t",adxl_x);

//        else printf("X=-%d\t",~adxl_x + 1);

//        if(adxl_y>=0) printf("Y=%d\t",adxl_y);

//        else printf("Y=-%d\t",~adxl_y + 1);

//        if(adxl_z>=0) printf("Z=%d\n",adxl_z);

//        else printf("Z=-%d\n",~adxl_z + 1);

        

        Lcd_Fill(adxl_y-5,adxl_x-5,adxl_y+5,adxl_x+5,LCD_RED);

        sprintf(buff,"x=%4d,y=%4d,z=%4d  ",adxl_x,adxl_y,adxl_z);

        lcd_disp_str_at(-LCD_W/2,-LCD_H/2,buff);

        

        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);

        sprintf(buff,"adc-x=%6d,adc-y=%6d  ",adc_value[1],adc_value[0]);

        lcd_disp_str_at(-LCD_W/2,-LCD_H/2 + 30,buff);

        

        Delay_ms(10);

        Lcd_Fill(adxl_y-5,adxl_x-5,adxl_y+5,adxl_x+5,LCD_WHITE);

        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);

        

        adc_ordinary_software_trigger_enable(ADC1, TRUE);

    }

}


 


 


 

.
---------------------
作者:WoodData
链接:https://bbs.21ic.com/icview-3341548-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值