AD采样的学习笔记陈宏敏2013-5-251、STM32AD简介:STM32集成了12位ADC,是一种逐次逼近型模拟数字转换器。它有18个通道,可以测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。2、ADC主要特征:12位分辨率,从通道0到通道n自动扫描模式,自校准,通道之间采样间隔可编程,ADC转换时间STM32F103xx增强型产品:ADC时钟为56MHz时为1us(ADC时钟为72MHz为1.17us),供电电压是2.7V到3.3V。ADC输入范围:VREF-=VIN=VREF+。3、下面通过实际例子说明:voidADC1_Configuration(void){ADC_InitTypeDefADC_InitStructure;ADC_DeInit(ADC1);//将外设ADC1的全部寄存器重设为缺省值/*ADC1设置------------------------------------------------------*/ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//ADC1工作在独立模式ADC_InitStructure.ADC_ScanConvMode=ENABLE;//ADC多通道扫描模式ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;//ADC模数转换工作在连续模式ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//外部触发模式由软件来触发ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//数据右对齐ADC_InitStructure.ADC_NbrOfChannel=ADCNO;//ADC通道数8个通道ADC_Init(ADC1,&ADC_InitStructure);//设置指定ADC的规则组通道,设置它们的转化顺序和采样时间//ADC1,ADC通道x,规则采样顺序值y,采样时间为55.5周期ADC_RegularChannelConfig(ADC1,ADC_Channel_4,FSY+1,ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC1,ADC_Channel_5,TGGZ+1,ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC1,ADC_Channel_6,XHWD+1,ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC1,ADC_Channel_7,DJDY+1,ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC1,ADC_Channel_8,BCXDY+1,ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC1,ADC_Channel_9,XQWD+1,ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC1,ADC_Channel_14,DCDY+1,ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC1,ADC_Channel_15,ABXDY+1,ADC_SampleTime_55Cycles5);ADC_DMACmd(ADC1,ENABLE);//使能ADC的DMA请求ADC_Cmd(ADC1,ENABLE);//使能指定的ADC1ADC_ResetCalibration(ADC1);//复位指定的ADC1的校准寄存器while(ADC_GetResetCalibrationStatus(ADC1));//获取ADC1复位校准寄存器的状态,设置状态等待ADC_StartCalibration(ADC1);//开始指定ADC1的校准状态while(ADC_GetCalibrationStatus(ADC1));//获取指定ADC1的校准程序,设置状态等待ADC_SoftwareStartConvCmd(ADC1,ENABLE);//使能ADC1的软件转换启动功能}4、AD值计算:voidAnalyse_Data(void){u16vTemp=0,NRT=0,k=0;uirec_counter++;if(uirec_counter==10000){uirec_counter=0;vTemp=(Afterfilter[DCDY]*173)11;//1电池电压精度0.1Vinmax=34VVin=vTemp&0x1FF;vTemp=(Afterfilter[DJDY]*3300)11;//2电机电压*20615精度0.1Vinmax=660VVBus=vTemp&0x1FFF;vTemp=(Afterfilter[TGGZ]*330)12;//3推杆故障精度0.01Vinmax=2VAHand=vTemp;//电压与电流的关系式如2.20V对应的电流显示5.0AAHand=(AHand*500)/220;vTemp=(Afterfilter[XQWD]*330)12;//4线圈温度vTemp软件放大100倍。//此处根据电路原理图来计算得出温度感应的电阻阻值1K电阻和5V供电500/(NRT+1K)=vTemp/1k.NRT=500000/vTemp-1000;js++;if(js=13){js=0;}else{if((WTemR[js]NRT)&&(NRT=WTemR[js+1])){k=(((WTemR[js]-NRT)*1000)/(WTemR[js]-WTemR[js+1]));WTemp=k+js*1000;}}}}软件能获取实时的AD采样值,主要是将AD值通过算法将AD值转换成我们能知道的文字,这里涉及的两部分的内容,一就是电路的电路图主要是电阻的比值,另外就是我们所以用的信号输入的数据手册,在这里做两个典型的AD采样学习笔记,DC24V电池电压采样和温度采样。AD输入的电压值是0到3.3V,对应的AD值就是0-0x0FFF,即0-4095。为什么是0x0FFF呢?这就是AD的分辨率决定的,AD的分辨率是12位,对应的就是0x0FFF。硬件电路端会涉及到一个极限电压或其他极限值,极限值对应的电压就是3.3V。这里就涉及到一个公式:Vo/3.3=Vin/Vimax=AD/4096,Vo是对应的0-3.3V电压,Vin是输入值,Vimax是极限值,AD是软件的AD采样,4096是AD分辨率值。所以Vin=(AD*Vimax)/4096。就能计算出输入的信号值,这时AD采样只是0-0x0FFF的采样值,这里我们软件可以设计采样的精度,比如vTemp=(Afterfilter[TGGZ]*330)12;//3推杆故障精度0.01Vinmax=2V330就是3.3V*100,精度就放大了100倍。温度的采样,我们不能容易直接从信号设备上获取值,我们可以经过电路板上的设计结合信号设备的数据手册,计算出数值。如:u32WTemR[13]={116510,68340,41554,26020,16623,10930,7329,5014,3498,2492,1800,1322,983};vTemp=(Afterfilter[XQWD]*330)12;//4线圈温度vTemp软件放大100倍。//此处根据电路原理图来计算得出温度感应的电阻阻值1K电阻和5V供电500/(NRT+1K)=vTemp/1k.NRT=500000/vTemp-1000;通过电路计算出信号发生设备的电阻值,根据数据手册上的电阻值对应的温度表,计算出温度。if((WTemR[js]NRT)&&(NRT=WTemR[js+1])){k=(((WTemR[js]-NRT)*1000)/(WTemR[js]-WTemR[js+1]));WTemp=k+js*1000;}这里的vTemp是我们板子上的电压0-3.3V(即Vo)。频率型的采样必须用PWM输入捕获来做,不能用AD。