|
发表于 2014-12-29 22:06:50
|
显示全部楼层
楼主你好,不止问题解决了没有,我的处理方法不用中断,MCU采用STM8S103FP6,我的使用方法是,每隔20ms调用一次
,可随意切换通道
- /***************************************************************
- *函数名 :ADC_GPIO_Init
- *描述 :ADC通道初始化
- *输入 :NULL
- *输出 :NULL
- *备注 :
- ****************************************************************/
- //配置对应的ADC通道为开漏输入方式
- //根据需要配置相应的AIN口,如果不需要,请删除相应IO配置使能
- //PC4 -- AIN2
- //PD2 -- AIN3
- //PD3 -- AIN4
- //PD5 -- AIN5
- //PD6 -- AIN6
- void Init_ADC(void)
- {
- ADC1_DeInit();
- ADC1->TDRH = 0x00;
- ADC1->TDRL = ( 1<< ADC1_SCHMITTTRIG_CHANNEL2 );
- ADC1->CSR = 0x07;
- ADC1->CR2 = ( ADC1_ALIGN_RIGHT );//右对齐
- ADC1->CR3 = 0x00;
- ADC1->CR1 = ( ADC1_PRESSEL_FCPU_D4 | ADC1_CR1_ADON ); //4分频,唤醒电源
- }
- /***************************************************************
- *函数名 :Get_Val_To_ADC
- *描述 :ADC取样
- *输入 :psc:分频系数; ADC1_CHANNEL_X:通道
- *输出 :RetADCVal
- *备注 :
- ****************************************************************/
- //ADC_Psc取值范围:0~7(对应:2, 3, 4, 6, 8, 10, 12, 18分频)
- //ADC1_CHANNEL_X取值范围:2~6
- uint16_t Get_Val_To_ADC( uint8_t ADC1_CHANNEL_X )
- {
- uint16_t MaxADCVal = 0; //取样最大值
- uint16_t MinADCVal = 1023; //取样最小值
- uint16_t TmpADCVal = 0; //取样中间值
- uint16_t RetADCVal = 0; //取样最终返回值
- uint8_t Index = 0;
- //转换通道 `
- ADC1->CSR = ADC1_CHANNEL_X;//转换通道
- for( Index = 0; Index < 10; Index ++ )
- {
- ADC1->CR1 |= ADC1_CR1_ADON;
- while( !(ADC1->CSR & ADC1_IT_EOC));
- ADC1->CSR &= (uint8_t)(~ADC1_FLAG_EOC);
- //提取10次的后6次,减去最大值与最小值后取平均值
- if ( Index >= 4)
- {
- TmpADCVal = ADC1_GetConversionValue();
- // TmpADCVal = ADC1->DRL;
- // TmpADCVal |= (ADC1->DRH<<8);
- RetADCVal += TmpADCVal;
- if ( MaxADCVal < TmpADCVal )
- {
- MaxADCVal = TmpADCVal;
- }
- if ( MinADCVal > TmpADCVal )
- {
- MinADCVal = TmpADCVal;
- }
- }
- }
- RetADCVal -= MinADCVal;
- RetADCVal -= MaxADCVal;
- RetADCVal = RetADCVal/4;
- return RetADCVal;
- }
复制代码 |
|