[N32G03x]

N32 ADC单通道、单次转换模式

[复制链接]
319|0
手机看帖
扫描二维码
随时随地手机跟帖
画个朴昧|  楼主 | 2022-9-15 15:35 | 显示全部楼层 |阅读模式
本帖最后由 画个朴昧 于 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)继续采集。



使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

47

帖子

4

粉丝