一.ADC简介
1.1ADC是什么
STM32F4 的 ADC 是 12 位逐次逼近型的模拟数字转换器。它有 19 个通道, 可测量 16 个外部源、2 个内部源和 Vbat 通道的信号。A/D转换的作用是将时间连续、幅值也连续的模拟量转换为时间离散、幅值也离散的数字信号,因此,A/D转换一般要经过取样、保持、量化及编码4个过程。在实际电路中,这些过程有的是合并进行的,例如,取样和保持,量化和编码往往都是在转换过程中同时实现的。模拟数字转换器的分辨率是指,对于允许范围内 的模拟信号,它能输出离散数字信号值的个数。这些信号值通常用二进制数来存储,因此分辨率经常用 比特作为单位,且这些离散值的个数是2的幂指数。例如,一个具有8位分辨率的模拟数字转换器可以将模拟信号编码成256个不同的离散值(因为2^8= 256),从0到255(即无符号整数)或从-128到127(即带符号整数),至于使用哪一种,则取决于具体的应用。
1.2规则通道和注入通道的区别
规则通道组和注入通道组。规则通道相当于你 正常运行的程序,而注入通道呢,就相当于中断。在你程序正常执行的时候,中断是可以打断 你的执行的。同这个类似,注入通道的转换可以打断规则通道的转换, 在注入通道被转换完成 之后,规则通道才得以继续转换。
1.3连续扫描和单次扫描模式
单次扫描模式:每一个ADC控制器对应着很多个通道,单次扫描每次只扫描一个通道,该模式可以通过 ADC_CR2 寄存 器的 ADON 位(只适用于规则通道)启动,也可以通过外部触发启动(适用于规则通道和注入通道),这时 CONT 位为 0。规则通道转换完结果存放在ADC_DR寄存器中,EOC(转换结束)标志将被置位,如果设置了 EOCIE,则会产生中断。然后 ADC 将停止,直到下次启动。注入通道转换完结果存放在ADC_JDR1寄存器中,JEOC(转换结束)标志将被置位,如果设置了 JEOCIE,则会产生中断。然后 ADC 将停止,直到下次启动。
连续扫描模式:每一个ADC控制器对应着很多个通道,连续扫描每次可以扫描多个通道一般要是有DMA来搬运数据。在连续的模式下,ADC结束后立即启动一个新的转换,COUNT位为1时,可通过外部触发或将ADC_CR2寄存器中的SWSTRT的位置1来启动此模式(仅适用规则通道)。每次转换完结果存放在ADC_DR寄存器中,EOC(转换结束)标志将被置位,如果设置了 EOCIE,则会产生中断。
二.规则通道单次转换寄存器配置
三.规则通道单次转换库函数配置
ADC_HandleTypeDef ADC1_Handler;//ADC句柄
void MY_ADC_Init(void)
{
ADC1_Handler.Instance=ADC1;
ADC1_Handler.Init.ClockPrescaler=ADC_CLOCK_SYNC_PCLK_DIV4; //4分频,ADCCLK=PCLK2/4=90/4=22.5MHZ
ADC1_Handler.Init.Resolution=ADC_RESOLUTION_12B; //12位模式
ADC1_Handler.Init.DataAlign=ADC_DATAALIGN_RIGHT; //右对齐
ADC1_Handler.Init.ScanConvMode=DISABLE; //非扫描模式
ADC1_Handler.Init.EOCSelection=DISABLE; //关闭EOC中断
ADC1_Handler.Init.ContinuousConvMode=DISABLE; //关闭连续转换
ADC1_Handler.Init.NbrOfConversion=1; //1个转换在规则序列中 也就是只转换规则序列1
ADC1_Handler.Init.DiscontinuousConvMode=DISABLE; //禁止不连续采样模式
ADC1_Handler.Init.NbrOfDiscConversion=0; //不连续采样通道数为0
ADC1_Handler.Init.ExternalTrigConv=ADC_SOFTWARE_START; //软件触发
ADC1_Handler.Init.ExternalTrigConvEdge=ADC_EXTERNALTRIGCONVEDGE_NONE;//使用软件触发
ADC1_Handler.Init.DMAContinuousRequests=DISABLE; //关闭DMA请求
HAL_ADC_Init(&ADC1_Handler); //初始化
}
u16 Get_Adc(u32 ch)
{
ADC_ChannelConfTypeDef ADC1_ChanConf;
ADC1_ChanConf.Channel=ch; //通道
ADC1_ChanConf.Rank=1; //第1个序列,序列1
ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_480CYCLES; //采样时间
ADC1_ChanConf.Offset=0;
HAL_ADC_ConfigChannel(&ADC1_Handler,&ADC1_ChanConf); //通道配置
HAL_ADC_Start(&ADC1_Handler); //开启ADC
HAL_ADC_PollForConversion(&ADC1_Handler,10); //轮询转换
return (u16)HAL_ADC_GetValue(&ADC1_Handler); //返回最近一次ADC1规则组的转换结果
}
就分享到这吧,后面会更新STM32和Linux的一些驱动学习,感兴趣的宝子可以关注我哦!