ADC模数转换基础以及应用

一.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的一些驱动学习,感兴趣的宝子可以关注我哦!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值