|
我是在STM8S开发板ADC采样滤波例程上做的修改,整体思路是AIN2的采样处理函数放在定时器内10ms调用一次,AIN3的采样处理函数放在同一定时器内500us调用一次 ,主程序100ms获取一次AIN2滤波后的值,3S获取一次AIN3滤波后的值,问题是当在定时器中断内屏蔽掉AIN2或AIN3的采样处理函数另外一个通道则采集正常,否则AIN2输入端与GND短接采集结果不为0,AIN3采集结果无明显变化。- /*
- *********************************************************************************************************
- * 函 数 名: AdcProTds
- * 功能说明: ADC采样处理,插入 systick中断进行调用
- * 形 参:无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void bsp_AdcProTds(void)
- {
- static uint16_t tds_buf[SAMP_COUNT_TDS];
- static uint8_t tds_write;
- uint16_t sum;
- uint8_t i;
-
- tds_buf[tds_write] = ADC1_GetConversionValue();
- if (++tds_write >= SAMP_COUNT_TDS)
- {
- tds_write = 0;
- }
- /* 下面这段代码采用求平均值的方法进行滤波
- 也可以改善下,选择去掉最大和最下2个值,使数据更加精确
- */
- sum = 0;
- for (i = 0; i < SAMP_COUNT_TDS; i++)
- {
- sum += tds_buf[i];
- }
- g_usAdc_Tds_Value = sum / SAMP_COUNT_TDS; /* ADC采样值由若干次采样值平均 */
- ADC1_StartConversion(); /* 软件启动下次ADC转换 */
- ADC1_ConversionConfig(ADC1_CONVERSIONMODE_SINGLE, ADC1_CHANNEL_3,ADC1_ALIGN_RIGHT);
- }
- /*
- *********************************************************************************************************
- * 函 数 名: AdcProTemp
- * 功能说明: ADC采样处理,插入 systick中断进行调用
- * 形 参:无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void bsp_AdcProTemp(void)
- {
- static uint16_t temp_buf[SAMP_COUNT_TEMP];
- static uint8_t temp_write;
- uint16_t sum;
- uint8_t i;
-
- temp_buf[temp_write] = ADC1_GetConversionValue();
- if (++temp_write >= SAMP_COUNT_TEMP)
- {
- temp_write = 0;
- }
- /* 下面这段代码采用求平均值的方法进行滤波
- 也可以改善下,选择去掉最大和最下2个值,使数据更加精确
- */
- sum = 0;
- for (i = 0; i < SAMP_COUNT_TEMP; i++)
- {
- sum += temp_buf[i];
- }
- g_usAdc_Temp_Value = sum / SAMP_COUNT_TEMP; /* ADC采样值由若干次采样值平均 */
- ADC1_StartConversion(); /* 软件启动下次ADC转换 */
- ADC1_ConversionConfig(ADC1_CONVERSIONMODE_SINGLE, ADC1_CHANNEL_2,ADC1_ALIGN_RIGHT);
- }
复制代码 |
|