/**************************************************************************
* 函数名:ADC_conf
* 描述 :ADC模块初始化
* 输入 :无
*
* 输出 :无
* 返回 :无
* 调用 :外部调用
*************************************************************************/
void ADC_conf(u8 chn)
{
GPIO_Init(GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_NO_IT);
ADC1_DeInit();//ADC1_CONVERSIONMODE_CONTINUOUS
ADC1_Init(ADC1_CONVERSIONMODE_SINGLE, //单次转换
ADC1_CHANNEL_2, //通道
ADC1_PRESSEL_FCPU_D4, //预定标器选择 分频器 fMASTER 可以被分频 2 到 18
ADC1_EXTTRIG_TIM, //从内部的TIM1 TRGO事件转换
DISABLE, //是否使能该触发方式
ADC1_ALIGN_RIGHT, //对齐方式(可以左右对齐)
ADC1_SCHMITTTRIG_CHANNEL2, //指定触发通道
ENABLE); //是否使能指定触发通道
ADC1_Cmd(ENABLE);
}
/****************************************************************************
* 名 称:
* 功 能:对数据进行冒泡排序
* 入口参数:
* 出口参数:
* 说 明:
* 调用方法:
****************************************************************************/
void DataFilter(u16 *data_in,u8 data_len)
{
u16 temp;
u8 i,j;
for(i = 0; i < data_len; i++)
{
for(j = i+1; j <data_len; j++)
{
if(data_in[i] < data_in[j])
{
temp = data_in[j];
data_in[j] = data_in[i];
data_in[i] = temp;
}
}
}
}
/**************************************************************************
* 函数名:ADC_GetConversionValue
* 描述 :获取ADC转换结果
* 输入 :无
*
* 输出 :无
* 返回 :无
* 调用 :内部调用
*************************************************************************/
uint16_t ADC_GetConversionValue(void)
{
uint16_t value,temph;
uint8_t templ;
ADC1_StartConversion();
// 定义templ存储低8位数据 temph存储高8位数据
while(!(ADC1->CSR & 0x80)); //等待转换完成
templ = ADC1->DRL;
temph = ADC1->DRH; //读取ADC转换 在左对齐和右对齐模式下 读取数据的顺序不同 参考STM8寄存器.PDFP371
value = (templ | (temph << 8)); //注意是10位的转换精度 value、temph应为unsigned int 变量
return value;
}
/****************************************************************************
* 名 称:
* 功 能:取冒泡排序的10个数组中的中间4个数组,减少误差。
* 入口参数:
* 出口参数:
* 说 明:
* 调用方法: call in 10ms
****************************************************************************/
void ReadInputVoltege(void)
{
u8 i;
u16 temp[READ_ADC_LEN];
for(i = 0; i < READ_ADC_LEN-1; i ++)
{
adc_input_voltage[i] = adc_input_voltage[i+1];
temp[i] = adc_input_voltage[i];
}
adc_input_voltage[READ_ADC_LEN-1] = ADC_GetConversionValue();
temp[READ_ADC_LEN-1] = adc_input_voltage[READ_ADC_LEN-1];
//0-8
DataFilter(&temp[0],READ_ADC_LEN);
ReadInputAdc = temp[3]+temp[4]+temp[5]+temp[6];
ReadInputAdc >>= 2; // /4
}
/****************************************************************************
* 名 称:获取实际电压函数
* 功 能:计算公式:实际电压值(voltage) = adc值*参考电压(3.25V)/1024(10位分辨率)
* 入口参数:
* 出口参数:
* 说 明:
* 调用方法:
****************************************************************************/
void DisVoltage(void)
{
u16 voltage;
voltage = (ReadInputAdc *325)/1024 ;// 配合一下硬件分压,没有分压值
voltage = voltage/100;
}
|