做网站seo的公司网站设置301重定向
 ADC(Analog-to-Digital Converter) 指模数转换器。是指将连续变化的模拟信号转换  
 
 为离散的数字信号的器件。  
 
 ADC相关参数说明:  
 
 分辨率:  
 
 分辨率以二进制(或十进制)数的位数来表示,一般有 8 位、10 位、12 位、16  
 
 位等,它说明模数转换器对输入信号的分辨能力,位数越多,表示分辨率越高,恢复模拟信  
 
 号时会更精确。  
 
 精度:  
 
 精度表示 ADC 器件在所有的数值点上对应的模拟值和真实值之间的最大误差值,  
 
 也就是输出数值偏离线性最大的距离。      
引脚   
      
    
 
ADC时钟   
         
   
   
 
 
     
转换结束以后可以触发中断,中断事件送至NVIC,切断中断控制器进行管理,最终给到cpu进行处理   
 转换速率:  
  转换速率是指 A/D 转换器完成一次从模拟到数字的 AD 转换所需时间的倒数。例  
  如,某 A/D 转换器的转换速率为 1MHz,则表示完成一次 AD 转换时间为 1 微秒。 
   
  7.1、STM32ADC介绍  
  是12bit逐次逼近型模拟数字转换器,有多达18个通道,可测量16个外部和2个内部信  
  号源,各通道的A/D转换可以单次、连续、扫描或间断模式执行,ADC的结果可以左对齐或  
  右对齐方式存储在16位数据寄存器中。  
  模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。 ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生。  
  ADC供电要求:2.4V到3.6V  
  ADC输入范围:VREF- ≤ VIN ≤ VREF+‘ 
  7.2、ADC框架 
 
 
 组成部分: 
  7.2.1、ADC引脚 对于stm32f103系列单片机来讲,能测量的转化的电压范围0-3.3V。  
  注:超出转换测量范围需要额外增加外围电路,使其电压范围纠正到0-3.3V内,然后再进行转换测量。  
 
 
 
引脚 
  7.2.2、ADC输入通道  
  ADC有16个外部输入通道和2路内部通道(温度传感器、内部参考电压)。  
  16个通道对应两种转换组:规则组和注入组,经由规则通道和注入通道转换,转换后  
  的数据写入对应的规则通道数据寄存器和注入通道数据寄存器*4  
  规则组:由多达16个转换组成  
  注入组:由多达4个转换组成  
  一般情况下我们都使用的是规则通道进行转换,转化顺序和转化总数由ADC_SQRx寄  
  存器进行设置;注入通道是在规则通道转换的时候强行插入的转换通道,转化顺序和转化总  
  数由ADC_JSQR寄存器进行设置。  
  利用外部触发或通过设置ADC_CR2寄存器的ADON位,启动一组规则通道的转换后。  
  如果在规则通道转换期间产生一外部注入触发,当前转换被复位,注入通道序列被以单次扫  
  描方式进行转换,然后恢复上次被中断的规则组通道转换;如果在注入转换期间产生一规则  
  事件,注入转换不会被中断,但是规则序列将在注入序列结束后被执行。  
  转换模式包括:单次转换模式、连续转换模式、间断模式和扫描模式 。 具体参考数据手册  
  11.3.4、11.3.5、11.3.8、11.3.10  
  对齐方式 :由于ADC为12bit精度,寄存器有效位16位,所有会涉及对齐方式:左对齐和右  
  对齐 
 
 
  DMA请求 :因为规则通道转换的值储存在一个仅有的数据寄存器中,所以当转换多个规则  
  通道时需要使用DMA,这可以避免丢失已经存储在ADC_DR寄存器中的数据。  
  只有在规则通道的转换结束时才产生DMA请求,并将转换的数据从ADC_DR寄存器传输到  
  用户  
  指定的目的地址。  
 通道,和内部通道(温度传感器和Vrefint即参考电压通道) 
  7.2.3、ADC时钟 
 
 
 
ADC时钟 
  可编程的通道采样时间  :ADC使用若干个ADC_CLK周期对输入电压采样,采样周期数目可  
  以通过ADC_SMPR1和ADC_SMPR2寄存器中的SMP[2:0]位更改;每个通道可以分别用不  
  同的时间采样。 
  总转换时间如下计算:  
  TCONV = 采样时间+ 12.5个周期  
  例如:采样周期设置为1.5周期  
  TCONV = 1.5+12.5 = 14个周期  
  频率为14MHz时,转换一次的时间为1us 
  7.2.4、触发转换方式  
  转换可以由外部事件触发(例如定时器捕获,EXTI线)。如果设置了EXTTRIG控制位,则  
  外部事  
  件就能够触发转换。EXTSEL[2:0]和JEXTSEL2:0]控制位允许应用程序选择8个可能的事件中  
  的  
  某一个,可以触发规则和注入组的采样 
 
 
 
 
  7.2.5、ADC中断  
  规则和注入组转换结束时能产生中断,当模拟看门狗状态位被设置时也能产生中断。它们都  
  有  
  独立的中断使能位。 
 
 
 
转换结束以后可以触发中断,中断事件送至NVIC,切断中断控制器进行管理,最终给到cpu进行处理  7.2.6、双ADC模式  
  在有2个或以上ADC模块的产品中,可以使用双ADC模式,在双ADC模式里,根据  
  ADC1_CR1寄存器中DUALMOD[2:0]位所选的模式,转换的启动可以是ADC1主和ADC2从  
  的交替触发或同步触发。  
  共有6种可能的模式:  
  ─ 同步注入模式  
  ─ 同步规则模式  
  ─ 快速交叉模式 ─ 慢速交叉模式  
  ─ 交替触发模式  
  ─  独立模式  
  还有可以用下列方式组合使用上面的模式:  
  ─ 同步注入模式 + 同步规则模式  
  ─ 同步规则模式 + 交替触发模式  
  ─ 同步注入模式 + 交叉模式   
   
   
    
   
 
   
   
   
   
   
配置pa4和pa5的两个引脚,再配置adc1和adc5;再开启dma的方式,通过的dma的方式将数据存放到内存上,不需要开启中断功能   
开启时钟,开发ADC1的时钟,开启GPIOA的时钟到APB2上,还要开启DMA1的时钟   
 
再配置gpio4和5,这两个引脚是模拟输入的功能, 
配置ADC,模式为独立模式;扫描转换模式开启了多通道扫描;开启了连续采集的功能;外部触发事件关掉了;对齐方式选择为右对齐;通道数为2; 
规则通道的配置,ADC1和5,周期都是1.5个周期;转换顺序是先转换4再去转换2 
   
开启了DMA功能 
设置了DMA的外设的地址,ADC的DR的地址,将DR的值读到内存上 
   
   
外设的地址是否递增关掉了 
使能了内存的递增 
ADC1的DR寄存器再转换通道4和通道5,又先后的顺序,先转换通道4再转换通道5,转换完通道4的数据就存放到DR寄存器中,再开启DMA功能,我们会把数据存放到指定的内存上,开辟的内存是定义的一个数组,把内存的地址给它,它通过DMA的方式将数据从DR上存放到数组里面,这个内存地址递增,转换通道5,转换通道5的数据存放到DR寄存器上,我们在通过DMA的方式将数据从DR上存放到数组中,转换完一次我们就可以读内存的数据了   
一次拷贝的地址大小为16bit位的数据 
开启的DMA模式为循环模式,循环的模式采集和读取模式 
  
  7.3、STM32ADC固件库函数介绍  
  7.3.1、ADC初始化  
  1  void  ADC_Init ( ADC_TypeDef *  ADCx ,  ADC_InitTypeDef *  ADC_InitStruct )  
  ADC初始化结构体:  
  1  typedef struct  
  2  {  
  3  uint32_t ADC_Mode ;  // 工作模式  
  4  FunctionalState ADC_ScanConvMode ;  //ADC 扫描(多通道)使能 / 失能  
  5  FunctionalState ADC_ContinuousConvMode ;  // 连续转换使能 / 失能  
  6  uint32_t ADC_ExternalTrigConv ;  //ADC 触发信号选择  
  7  uint32_t ADC_DataAlign ;  //ADC 数据对齐模式  
  8  uint8_t ADC_NbrOfChannel ;  //ADC 采集通道  
  9  }  
  1、ADC_Mode  
  1  ADC_Mode_Independent  //ADC1  和  ADC2  工作在独立模式  
  2  ADC_Mode_RegInjecSimult  //ADC1  和  ADC2  工作在同步规则和同步注入模式  
  3  ADC_Mode_RegSimult_AlterTrig  //ADC1 和 ADC2 工作在同步规则模式和交替触发模式  
  4  ADC_Mode_InjecSimult_FastInterl  //ADC1 和 ADC2 工作在同步规则模式和快速交替模式  
  5  ADC_Mode_InjecSimult_SlowInterl  //ADC1 和 ADC2 工作在同步注入模式和慢速交替模式  
  6  ADC_Mode_InjecSimult  //ADC1  和  ADC2  工作在同步注入模式  
  7  ADC_Mode_RegSimult  //ADC1  和  ADC2  工作在同步规则模式  
  8  ADC_Mode_FastInterl  //ADC1  和  ADC2  工作在快速交替模式  
  9  ADC_Mode_SlowInterl  //ADC1  和  ADC2  工作在慢速交替模式  
  10  ADC_Mode_AlterTrig  //ADC1  和  ADC2  工作在交替触发模式  
  2、ADC_ScanConvMode  
  1  //ADC 的扫描模式 , 不断扫描 ADC1,2,3, 扫描多用在多通道上  
  2  ENABLE  
  3  DISABLE  
  3、ADC_ContinuousConvMode 1  // 连续转换模式 ,ADC 通道连续采集 , 一次采集转化完继续采集  
  2  ENABLE  
  3  DISABLE  
  4、ADC_ExternalTrigConv  
  1  // 外部触发转换选择  
  2  ADC_ExternalTrigConv_T1_CC1  // 选择定时器  1  的捕获比较  1  作为转换外部触发  
  3  ADC_ExternalTrigConv_T1_CC2  // 选择定时器  1  的捕获比较  2  作为转换外部触发  
  4  ADC_ExternalTrigConv_T1_CC3  // 选择定时器  1  的捕获比较  3  作为转换外部触发  
  5  ADC_ExternalTrigConv_T2_CC2  // 选择定时器  2  的捕获比较  2  作为转换外部触发  
  6  ADC_ExternalTrigConv_T3_TRGO  // 选择定时器  3  的  TRGO 作为转换外部触发  
  7  ADC_ExternalTrigConv_T4_CC4  // 选择定时器  4  的捕获比较  4  作为转换外部触发  
  8  ADC_ExternalTrigConv_Ext_IT11  // 选择外部中断线  11  事件作为转换外部触发  
  9  ADC_ExternalTrigConv_None  // 转换由软件而不是外部触发启动  
  5、ADC_DataAlign  
  1  #define  ADC_DataAlign_Right  (( uint32_t ) 0x00000000 )  
  2  #define  ADC_DataAlign_Left  (( uint32_t ) 0x00000800 )  
  6、ADC_NbrOfChannel  
  1  ADC 要转化的通道数目 , 可以设置为 1 ‐ 16  
  7.3.2、使能/失能ADC外设  
  1  void  ADC_Cmd ( ADC_TypeDef *  ADCx ,  FunctionalState NewState )  
  7.3.3、使能/失能ADC的DMA功能  
  1  void  ADC_DMACmd ( ADC_TypeDef *  ADCx ,  FunctionalState NewState )  
  7.3.4、ADC中断功能配置  
  1  void  ADC_ITConfig ( ADC_TypeDef *  ADCx ,  uint16_t  ADC_IT ,  \  
  2  FunctionalState NewState )  
  @arg ADC_IT_EOC: End of conversion interrupt mask  
  @arg ADC_IT_AWD: Analog watchdog interrupt mask  
  @arg ADC_IT_JEOC: End of injected conversion interrupt mask  
  7.3.5、ADC获取转换值  
  1  uint16_t  ADC_GetConversionValue ( ADC_TypeDef *  ADCx );  
  7.3.6、ADC获取和清除中断标志  
  1  ITStatus  ADC_GetITStatus ( ADC_TypeDef *  ADCx ,  uint16_t  ADC_IT );  
  2  void  ADC_ClearITPendingBit ( ADC_TypeDef *  ADCx ,  uint16_t  ADC_IT );  
  7.3.7、ADC预分频配置  
  1  void  RCC_ADCCLKConfig ( uint32_t  RCC_PCLK2 )  
  @arg RCC_PCLK2_Div2: ADC clock = PCLK2/2 @arg RCC_PCLK2_Div4: ADC clock = PCLK2/4  
  @arg RCC_PCLK2_Div6: ADC clock = PCLK2/6  
  @arg RCC_PCLK2_Div8: ADC clock = PCLK2/8  
  7.3.8、ADC使能/失能软件触发转换  
  1  void  ADC_SoftwareStartConvCmd ( ADC_TypeDef *  ADCx ,  FunctionalState  
  NewState )  
  7.3.9、ADC使能/失能外部触发转换  
  1  void  ADC_ExternalTrigConvCmd ( ADC_TypeDef *  ADCx ,  FunctionalState NewState )  
  7.3.10、ADC规则转换通道配置  
  1  void  ADC_RegularChannelConfig ( ADC_TypeDef *  ADCx ,  uint8_t ADC_Channel ,  \  
  2  uint8_t Rank ,  \uint8_t ADC_SampleTime )  
  ADC_Channel:  
  1  @arg ADC_Channel_0 :  ADC  Channel0 selected  
  2  @arg ADC_Channel_1 :  ADC  Channel1 selected  
  3  @arg ADC_Channel_2 :  ADC  Channel2 selected  
  4  @arg ADC_Channel_3 :  ADC  Channel3 selected  
  5  @arg ADC_Channel_4 :  ADC  Channel4 selected  
  6  @arg ADC_Channel_5 :  ADC  Channel5 selected  
  7  @arg ADC_Channel_6 :  ADC  Channel6 selected  
  8  @arg ADC_Channel_7 :  ADC  Channel7 selected  
  9  @arg ADC_Channel_8 :  ADC  Channel8 selected  
  10  @arg ADC_Channel_9 :  ADC  Channel9 selected  
  11  @arg ADC_Channel_10 :  ADC  Channel10 selected  
  12  @arg ADC_Channel_11 :  ADC  Channel11 selected  
  13  @arg ADC_Channel_12 :  ADC  Channel12 selected  
  14  @arg ADC_Channel_13 :  ADC  Channel13 selected  
  15  @arg ADC_Channel_14 :  ADC  Channel14 selected  
  16  @arg ADC_Channel_15 :  ADC  Channel15 selected  
  17  @arg ADC_Channel_16 :  ADC  Channel16 selected  
  18  @arg ADC_Channel_17 :  ADC  Channel17 selected  
  Rank:通道采样顺序:1-16  
  ADC_SampleTime:  
  1  @arg ADC_SampleTime_1Cycles5 :  Sample time equal to  1.5  cycles  
  2  @arg ADC_SampleTime_7Cycles5 :  Sample time equal to  7.5  cycles  
  3  @arg ADC_SampleTime_13Cycles5 :  Sample time equal to  13.5  cycles  
  4  @arg ADC_SampleTime_28Cycles5 :  Sample time equal to  28.5  cycles 5  @arg ADC_SampleTime_41Cycles5 :  Sample time equal to  41.5  cycles  
  6  @arg ADC_SampleTime_55Cycles5 :  Sample time equal to  55.5  cycles  
  7  @arg ADC_SampleTime_71Cycles5 :  Sample time equal to  71.5  cycles  
  8  @arg ADC_SampleTime_239Cycles5 :  Sample time equal to  239.5  cycles  
  7.4、ADC实例  
  7.4.1、ADC单通道中断采集  
 1、ADC通道初始化 
 需要知道那些功能模块调用初始化函数 
 引脚先看原理图,先查看模拟量接到了那个通道上了,你接到了那个通道就对那个通道进行采集 
 
  比如ADC1/2使用ps4通道,设置ps4的引脚为模拟输入的引脚,还需要开启gpio的时钟就需要调用gdc的初始化函数,开启ADC的时钟转换完成,触发中断,NVIC也需要配置 
 
  使用的ADC1的通道4的pA4引脚, 
 
  开启对应的时钟,ADC1,GPIOA的时钟在APB2总线上 
 
 
 对ADC1的总线时钟进行分频,最大14m 
 
 
 
 gpio设置,gpio引脚为gpiopin4,模式为模拟输入的模式 
 
 设置初始化结构体,模式为独立模式;扫描转换模式关掉了;连续转换设置为使能了;外部触发事件关掉了;对齐方式选择为右对齐;转换的通道模式为1,; 
 
 
 开启中断的转换通道,设置为ADC1,通道4,1是转换顺序设置为第一次转换,转换的周期为1.5个周期 
 
 转换完成中断 
 使能了ADC 
 
 配置了NVIC,设置了NVIC的优先级 
 
 
 初始化好ADC通道,通过软件的方式开启ADC的模式转换,将转换好的结果存放到数据寄存器中,触发一个中断 
 
 
 到ADC中断中判断规则转换是否完成,如果是转换完成,就去读它的数据值,读取成功后赋值给一个变量,最终去清除转换的标志位 
 
 
 将读到的值转换成电压值,将转换的电压值通过串口的方式读取出来看有没有问题 
 
  7.4.2、ADC多通道DMA采集  
 
配置pa4和pa5的两个引脚,再配置adc1和adc5;再开启dma的方式,通过的dma的方式将数据存放到内存上,不需要开启中断功能 
开启时钟,开发ADC1的时钟,开启GPIOA的时钟到APB2上,还要开启DMA1的时钟 查看DMA1的配置,ADC1对应ADC1通道 
 
 
再配置gpio4和5,这两个引脚是模拟输入的功能, 
配置ADC,模式为独立模式;扫描转换模式开启了多通道扫描;开启了连续采集的功能;外部触发事件关掉了;对齐方式选择为右对齐;通道数为2; 
规则通道的配置,ADC1和5,周期都是1.5个周期;转换顺序是先转换4再去转换2 
 开启ADC1的DMA功能,再开启ADC1 
关闭了NVIC功能 
 
关闭了NVIC功能 
开启了DMA功能 内存的地址,放两个转换好的值 
 外设的方向设置为把这个外设作为圆,从ADC1的dr中拷贝数据到内存中 
 
 buffer的大小为2个,两个通道为2 
 
ADC1的DR寄存器再转换通道4和通道5,又先后的顺序,先转换通道4再转换通道5,转换完通道4的数据就存放到DR寄存器中,再开启DMA功能,我们会把数据存放到指定的内存上,开辟的内存是定义的一个数组,把内存的地址给它,它通过DMA的方式将数据从DR上存放到数组里面,这个内存地址递增,转换通道5,转换通道5的数据存放到DR寄存器上,我们在通过DMA的方式将数据从DR上存放到数组中,转换完一次我们就可以读内存的数据了 DMA的内存拷贝关掉 
初始化dma通道成功 
 开启DMA通道为dma1 
 
dma和ADC1初始化好了,就可以去读取DR中的数据到内存中,读取通道中断数据到数组中进行计算 就是转换后的dr值,再去测量电压值,完成多通道的adc的采集 
 
 
dma和ADC1初始化好了,就可以去读取DR中的数据到内存中,读取通道中断数据到数组中进行计算 就是转换后的dr值,再去测量电压值,完成多通道的adc的采集 接线方式 
 接入的pa4和pa5,可以通过滑动电阻调节电阻 
 
 
 
 
 