GD32F303单片机学习记录1 ADC初始化配置

本文详细介绍了如何通过GPIO口初始化ADC,包括设置GPIO模式、速度和引脚,以及配置ADC的时钟、分频、同步模式、转换模式、采样精度、数据对齐、通道选择和外部触发。同时涉及DMA模式启用和ADC校准的过程。
摘要由CSDN通过智能技术生成

1:初始化ADC所用到的GPIO口

(主要包括使能对应的GPIO时钟,GPIO模块GPIOA或GPIOB等等,GPIO模式(输入或者输出),GPIO的速度,引脚选择)

    rcu_periph_clock_enable(RCU_GPIOA);//使能GPIO时钟
    gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_MAX, GPIO_PIN_6 | GPIO_PIN_7| GPIO_PIN_8|);//初始化GPIO引脚

2: 使能ADC时钟和对ADC时钟进行分频

    rcu_periph_clock_enable(RCU_ADC0);//使能ADC种用到哪个ADC就使能对应的时钟
    rcu_adc_clock_config(RCU_CKADC_CKAHB_DIV5); /*对ADC时钟进行分频,系统时钟的频率为120MHZ ADC时钟频率:AHB=120MHz/5 = 24MHz*/

 3:配置ADC同步模式

配置ADC同步模式为独立模式,这时每一个ADC模块(ADC0,ADC1,ADC2)都是独立工作的

  adc_mode_config(ADC_MODE_FREE);

4:配置ADC转换模式为非连续转换,扫描模式 

(ADC扫描模式,当配置了多个ADC通道时依次采集各个通道的数据)

(ADC非连续转换模式表示ADC触发之后只转换一次,转换结束后要等到下一次触发)

  adc_special_function_config(ADCX, ADC_SCAN_MODE, ENABLE);//ADC扫描模式

  adc_special_function_config(ADCX, ADC_CONTINUOUS_MODE, DISABLE);//ADC连续转换模式关闭

5:配置ADC采样精度

精度为12位(ADC采集精度有6位,8位,12位)

  adc_resolution_config(ADC0, ADC_RESOLUTION_12B);

6:配置ADC数据对齐方式

对齐方式为右对齐

  adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);

7:配置ADC通道

(配置ADC规则组通道,通道数量为3,通过查数据手册获得前面所配置各个GPIO口分别对应的ADC通道,并将各个通道进行排序,排好序后ADC扫描模式就按照排序依次采集) 

     adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 3);(规则组,通道数量为3)
    adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_6, ADC_SAMPLETIME_13POINT5);(GPIOA6脚对应ADC0的通道6,排序为0,采样时间为13.5个周期)
    adc_regular_channel_config(ADC0, 1, ADC_CHANNEL_7, ADC_SAMPLETIME_13POINT5);
    adc_regular_channel_config(ADC0, 2, ADC_CHANNEL_8, ADC_SAMPLETIME_13POINT5);

8:使能ADC外部触发,配置外部触发源

使能ADC外部触发(ADC可以通过外部的一些信号来进行触发开始采样),

配置外部触发源(用什么外部信号来触发ADC采样,触发源的选择如下图,不同ADC模块触发源不同) 

 

 adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);//使能外部触发
 adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);//选择外部触发方式为软件触发

 9:校准ADC

(ADC自带的校准),ADC校准有时间要求所以要加一个延时

    usr_DelayMs(1);

    adc_calibration_enable(ADC0);//ADC校准

10: 使能DMA模式

(ADC规则组只有一个数据寄存器当配置了多个ADC通道并开启扫描模式时就需要配合DMA,当ADC每采集完一个通道将数据送到数据寄存器中时就使用DMA将数据寄存器中的数据搬到其它地方进行存储(可以自己定义一个数组存储),以免当ADC采集下一个通道将数据送到数据寄存器中时覆盖了上一个通道的数据导致数据丢失)

   adc_dma_mode_enable(ADC0);//使能DMA

11:使能ADC(当配置完ADC后还需要使能ADC只有这样触发ADC,ADC才能开始工作) 

最终上完整代码

其中ADC使用软件触发还需要添加代码(每运行一次该代码就触发一次ADC采样),该代码可以放到中断函数中那么每进一次中断就会触发一次ADC采样

		adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);//ADC采样软件触发

	 rcu_periph_clock_enable(RCU_GPIOA);
    gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_MAX, GPIO_PIN_6 | GPIO_PIN_7| GPIO_PIN_8|);

    rcu_periph_clock_enable(RCU_ADC0);
    rcu_adc_clock_config(RCU_CKADC_CKAHB_DIV5); /*AHB=120MHz/5 = 24MHz*/
    adc_mode_config(ADC_MODE_FREE);
    adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);
    adc_resolution_config(ADC0, ADC_RESOLUTION_12B);
    adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);

    adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 3);
    adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_6, ADC_SAMPLETIME_13POINT5);
    adc_regular_channel_config(ADC0, 1, ADC_CHANNEL_7, ADC_SAMPLETIME_13POINT5);
    adc_regular_channel_config(ADC0, 2, ADC_CHANNEL_8, ADC_SAMPLETIME_13POINT5);
 
    adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);
    adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, 
    ADC0_1_2_EXTTRIG_REGULAR_NONE);


    usr_DelayMs(1);

    adc_calibration_enable(ADC0);

    adc_dma_mode_enable(ADC0);

    adc_enable(ADC0);

   

上述只是简单配置,还有ADC选择右对齐的原因,ADC注入组,ADC中断等很多东西还未添加完善,希望与各位共同进步

GD32系列单片机ADC(Analog-to-Digital Converter,模拟数字转换器)初始化主要包括以下几个步骤: 1. **包含头文件**: ```c #include "gd32f4xx_adc.h" ``` 2. **配置时钟**: ADC需要ADCCLK时钟,通常通过系统时钟分频得到。例如,如果你使用PLL设置: ```c // 分配ADC时钟 ADC_InitTypeDef ADC_InitStructure; ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // 如果你想独立使用ADC ADC_InitStructure.ADC_Prescaler = ADC_Prescaler_Div2; // 根据需求选择预分频因子 ADC_InitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; // 如果不需要DMA,设为Disabled ADC_InitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_1Cycle; // 取样时间 HAL_ADC_Start(&ADC1); // 开启ADC时钟 ``` 3. **选择通道和模式**: 根据你的硬件配置配置你要使用的ADC通道和工作模式(连续、扫描等): ```c ADC_ChannelConfTypeDef sChannelConfig; sChannelConfig.Channel = ADC_Channel_0; // 设置要转换的通道 sChannelConfig.Rank = ADC_Rank_1; // 设置位深度(8、12或16位) sChannelConfig.SamplingTime = ADC_SamplingTime_250us; // 取样时间 ADC箔AddChannel(&ADC1, &sChannelConfig); // 添加通道到转换序列 ``` 4. **启动转换**: ```c ADC_Cmd(&ADC1, ENABLE); // 启动ADC模块 ``` 5. **处理中断**(如果需要): ```c HAL_NVIC_EnableIRQ(ADC_IRQn); // 开启ADC中断 ``` 6. **数据读取**: 使用`HAL_ADC_GetValue(&ADC1)`获取转换结果。 注意:以上代码仅作示例,实际应用中可能需要根据你的GD32F4xx系列芯片的具体型号和版本做相应调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值