- /**************************************************************************
- * 函数名: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;
- }
|