四、ADC采集
复旦微FMG033系列的ADC是11位的。
我直接上最主要的采集ADC代码吧:
//ADC外部输入通道测试
uint32 Test_ADC_ExVolt(uint8_t Ch_selec)
{
uint16 ADCData[16];
uint08 i;
volatile uint32 fVlotage = 0;
uint32 fTempADC = 0;
ADC_IO_Init(); //IO口配置为ADC输入
ADC_Init_TsetExVolt(Ch_selec); //配置ADC
for(i=0; i<16; i++)
{
ADCData[i] = 0;
}
ADC_Struct.Bufu16 = ADCData;//数据缓冲区地址
ADC_Struct.SampleNeed = 15; //需要采样数据的个数,需要8个有效数据,第一个采样结果丢弃
ADC_Struct.SampleCount = 0; //清零采样计数
ANAC_ADCCON_ADC_EN_Setable(ENABLE); //ADC启动
while(ADC_Struct.SampleCount != ADC_Struct.SampleNeed);//等待转换完成
//计算8次采样数据的平均值
fTempADC = 0;
for(i=3; i<15; i++)
{
fTempADC += ADCData[i];
}
fTempADC = fTempADC/12.0;
fVlotage = ANAC_ADC_VoltageCalc(fTempADC,12);//AD值转换为电压,电源电压为5V
return fVlotage;
}
uint32_t ANAC_ADC_VoltageCalc(uint32_t fADCData,uint8_t Vdd)函数是例程中的函数,没有改过。
int main(void)
{
uint32 value_adc=0;
float adc_v;
value_adc = Test_ADC_ExVolt(CH_IN1);
adc_v;=value_adc /1000 ;
}
得到的adc_v是使用ADC码值对应的电压值这样的分段函数计算出来的引脚值。是引脚上的电压,且单位是伏v。分段函数就是此函数:uint32_t ANAC_ADC_VoltageCalc(uint32_t fADCData,uint8_t Vdd)里面进行计算的,出来的电压单位是mv。
当然也可以不用分段函数来得到引脚电压值。直接在函数uint32 Test_ADC_ExVolt(uint8_t Ch_selec)中返回 fTempADC这个值。
那主函数变为:
int main(void)
{
uint32 value_adc=0;
float adc_v;
value_adc = Test_ADC_ExVolt(CH_IN1);
adc_v =value_adc * (ADC_VOLTAGE_REF / 2047)
}
adc_v 就是使用参考电压和adc采集的电压计算出来的引脚电压值,ADC_VOLTAGE_REF 是参考电压,2047是因为ADC分辨率是11bit,所以参考电压能对应的最大的数,就是2的11次方-1。
在此附上一段数字转字符的函数,也许在显示中有所用到。
/*
@ 数字转字符串
@ value:输入数字
@ str:输出字符串
@return:字符串长度
@ by fll
*/
uint8_t Int2String(uint32_t value,uint8_t *str)
{
uint32_t i=0;
uint32_t j=0;
uint32_t temp=0;
if(value==0)
{
str[i]=0+'0';
}
else
{
while(value)
{
str[i++]=value%10+'0';
value/=10;
}
for( ;j<i/2;j++)
{
i=i-1+j;
temp=str[i];
str[i]=str[j];
str[j]=temp;
}
}
return (i+1);
}