工具/软件:Code Composer Studio
您好!
我想读取 ADC 通道、我正在使用 ADCINT1通过中断读取该通道(如 controlsuit 中的示例)。 我为 ADC 读取的值噪声很大、因此我希望使用低通滤波器来读取这些值。 我知道数字低通滤波器可以这样写:
y (n)=(1-2^(-k))* y (n-1)+x (n)
我的问题是、如何为 ADC 实施此滤波器?
到目前为止、我已经在 ADC_ISR 函数中编写了一个代码、但它给出了无效读取(4e27)。 这是我的代码:
void ADC_Config (void) { EALLOW; AdcRegs.ADCCTL2.bit.ADCNONOVERLAP = 1;//启用非重叠模式 AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1;// ADCINT1在 AdcResults 锁存后跳闸 AdcRegs.INTSEL1N2.bit.INT1E = 1;//启用 ADCINT1 AdcRegs.INTSEL1N2.bit.INT1CONT = 0;//禁用 ADCINT1连续模式 AdcRegs.INTSEL1N2.bit.INT1SEL = 1;//设置 EOC1以触发 ADCINT1触发 AdcRegs.ADCSOC0CTL.bit.CHSEL = 0;//将 SOC0通道选择设置为 ADCINA0 AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 0xD;//设置 SOC0在 EPWM1A 上启动触发器、因为轮询 SOC0先转换、然后 SOC1 AdcRegs.ADCSOC0CTL.bit.ACQPS = 6;//将 SOC0 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1) EDIS; //假设 ePWM1时钟已在 InitSysCtrl()中启用; EPwm5Regs.ETSEL.bit.SOCAEN = 1; //在组上启用 SOC EPwm5Regs.ETSEL.bit.SOCASEL = 4; //在递增计数时从 CMPA 中选择 SOC EPwm5Regs.ETPS.bit.SOCAPRD = 1; //在发生第一个事件时生成脉冲 EPwm5Regs.CMPA.half-CMPA = 1000;//设置比较 A 值 EPwm5Regs.TBPRD = 2000;//为 ePWM1设置周期 EPwm5Regs.TBCTL.bit.CTRMODE = 0; //向上计数并启动 EDIS; } __interrupt void ADC_ISR (void) { INTERRUPT_TICT++; IF (RESULT_indexV1在我的 ADC_ISR 中、我要首先减去每个数据读取的平均值、然后使用滤波器公式(k=4)、最后读取标准化输出(Voltage1)。 我认为中断频率比我的代码更快、因此当我在代码中读取 Voltage1时、它应该已经收集了大量数据并从低通滤波器传递这些数据。 我是对的吗?