本帖最后由 画个朴昧 于 2022-9-15 15:44 编辑
单通道、单次转换模式是ADC模式中最简单的转换方式,ADC执行单个通道CHn的一次转换(单次采样),并在转换完成后停止。下一次转换则需要再一次使能start位。启动ADC工作,连接特定单模拟通道,采样保持输入电压值,断开连接此通道,ADC通过逐次逼近计算出采样值,输出到数据寄存器,ADC停止工作。 应用场景:采样的模拟量单一,希望通过软件控制读取时间,实时响应不需要太快,如:特定时刻采样电源分压值、电位器输出电压值和NTC分压值等其中一种模拟量,进行单独处理,可以应用此工作模式。
单通道单次转换的软件配置如下:
1) 开启ADC外设模块时钟,总共三个工作时钟:HCLK、ADC_CLK、ADC_1MCLK,其中ADC_CLK最大可配置为18MHZ,只要不超过即可;
2) 配置采样通道为模拟输入模式;
3) 复位ADC模块,配置ADC工作在单通道单次转换模式;
4) 配置ADC触发模式为软件触发,数据寄存器数据右对齐,采样通道数量为1;
5) 配置采集的通道 为规则通道,采样顺序为1,其采样时间更具需求进行配置;
6) 使能ADC,等待ADC准备及上电完成;
7) 使能软件触发ADC转换,等待ADC转换完成,读取ADC值。
接下来通过配置PA5为模拟输入模式,演示单通道单次转换模式: l 定义ADC、GPIO初始化配置结构体,成员进行初始化,同时使能GPIOA时钟,配置PA5为模拟输入模式 1. ADC_InitType ADC_InitStructure;
2. GPIO_InitType GPIO_InitStructure;
3.
4. DDL_ZERO_STRUCT(ADC_InitStructure);
5. DDL_ZERO_STRUCT(GPIO_InitStructure);//结构体成员初始化为0
6.
7. //使能外设GPIO时钟
8. RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA,ENABLE);
9.
10. /****************ADC的1个外部通道配置为模拟输入************************/
11. GPIO_InitStructure.Pin = GPIO_PIN_5;
12. GPIO_InitStructure.GPIO_Pull = GPIO_NO_PULL; //无上下拉电阻
13. GPIO_InitStructure.GPIO_Mode = GPIO_MODE_ANALOG; //模拟通道
14. GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_LOW; //反转速率:低速
15. GPIO_InitStructure.GPIO_Current = GPIO_DC_LOW; //驱动能力:低
16. GPIO_InitStructure.GPIO_Alternate = GPIO_NO_AF; //无复用功能
17. GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
l 配置ADC三个工作时钟,使能ADC的AHB时钟,1M时钟来源HSI进行8分频,ADC_CLK进行3分频,采样时钟为16MHZ 1. /****************ADC时钟配置************************/
2. /* 使能ADC时钟 */
3. RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_ADC, ENABLE);
4. /* 使能ADC 1M时钟 */
5. RCC_EnableHsi(ENABLE);
6. RCC_ConfigAdc1mClk(RCC_ADC1MCLK_SRC_HSI, RCC_ADC1MCLK_DIV8);//用于内部计时功能,本例程使用HSI
7. /* ADC采样时钟源*/
8. RCC_ConfigAdcHclk(RCC_ADCHCLK_DIV3);//16MHZ /最大可配18MHZ
l 复位ADC模块,结构体ADC_InitStructure配置工作在单通道单次转换模式,软件触发转换,数据右对齐,通道数为1。规则通道PA5采样顺序为1,采样周期为56.6个cycle。 ADC_DeInit(ADC);
2. /* ADC 配置 ------------------------------------------------------*/
3. ADC_InitStructure.MultiChEn = DISABLE; //单通道模式
4. ADC_InitStructure.ContinueConvEn = DISABLE; //单次转换
5. ADC_InitStructure.ExtTrigSelect = ADC_EXT_TRIGCONV_NONE;//软件触发模式
6. ADC_InitStructure.DatAlign = ADC_DAT_ALIGN_R; //数据右对齐
7. ADC_InitStructure.ChsNumber = 1; //通道数:1
8. ADC_Init(ADC, &ADC_InitStructure);
9.
10. /* ADC 1个外部通道配置 */
11. ADC_ConfigRegularChannel(ADC, ADC_CH_5_PA5, 1, ADC_SAMP_TIME_56CYCLES5);
l 使能ADC,等待ADC准备及上电完成。 1. /* 使能ADC */
2. ADC_Enable(ADC, ENABLE);
3. /*等待ADC准备*/
4. while(!ADC_GetFlagStatusNew(ADC, ADC_FLAG_RDY));
5. /*等待ADC上电*/
6. while(ADC_GetFlagStatusNew(ADC, ADC_FLAG_PD_RDY));
l 使能软件触发ADC转换,等待ADC转换完成,清除转换完成标志,读取ADC值到定义的数组ADC_RegularConvertedValueTab[0]。 1. ADC_EnableSoftwareStartConv(ADC, ENABLE);
2.
3. while(ADC_GetFlagStatus(ADC,ADC_FLAG_ENDC)==0);
4.
5. ADC_ClearFlag(ADC,ADC_FLAG_ENDC);
6. ADC_ClearFlag(ADC,ADC_FLAG_STR);
7. ADC_RegularConvertedValueTab[0] = ADC_GetDat(ADC);
按照此流程,采集的PA5通道电压值即存储在ADC_RegularConvertedValueTab[0] 中,用户可通过多次调用ADC_EnableSoftwareStartConv(ADC, ENABLE)继续采集。
|