#include <stdio.h>
#include <stdint.h>
uint16_t S_IIR; //тело фильтра (максимум 14 значащих разрядов)
uint16_t resultADC; // результат преобразования АЦП (10 разрядов)
uint16_t outputResult; // выводимый результат фильтрации (10 разрядов)
void smooth_cycle() {
S_IIR=S_IIR-(S_IIR>>4)+resultADC; // S[t+1]=((1-β)*S[t])+A[t+1], где β=0,0625=1/16
outputResult=(S_IIR+8)>>4; // округление и приведение к целому
printf("resultADC:%d outputResult:%d\n", (int)resultADC
, (int)outputResult
); }
void test_adc(uint16_t x) {
printf("set resultADC to: %d\n", (int)x
); resultADC = x;
for (int i = 0; i < 50; i++) smooth_cycle();
}
int main(void) {
S_IIR = 0;
test_adc(5);
test_adc(3);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRpbnQuaD4KCnVpbnQxNl90ICBTX0lJUjsgIC8v0YLQtdC70L4g0YTQuNC70YzRgtGA0LAgKNC80LDQutGB0LjQvNGD0LwgMTQg0LfQvdCw0YfQsNGJ0LjRhSDRgNCw0LfRgNGP0LTQvtCyKQp1aW50MTZfdCAgcmVzdWx0QURDOyAgIC8vINGA0LXQt9GD0LvRjNGC0LDRgiAg0L/RgNC10L7QsdGA0LDQt9C+0LLQsNC90LjRjyDQkNCm0J8gKDEwINGA0LDQt9GA0Y/QtNC+0LIpCnVpbnQxNl90ICBvdXRwdXRSZXN1bHQ7ICAgLy8g0LLRi9Cy0L7QtNC40LzRi9C5INGA0LXQt9GD0LvRjNGC0LDRgiDRhNC40LvRjNGC0YDQsNGG0LjQuCAoMTAg0YDQsNC30YDRj9C00L7QsikKCnZvaWQgc21vb3RoX2N5Y2xlKCkgewoJU19JSVI9U19JSVItKFNfSUlSPj40KStyZXN1bHRBREM7IC8vIFNbdCsxXT0oKDEtzrIpKlNbdF0pK0FbdCsxXSwg0LPQtNC1IM6yPTAsMDYyNT0xLzE2CglvdXRwdXRSZXN1bHQ9KFNfSUlSKzgpPj40OyAgLy8g0L7QutGA0YPQs9C70LXQvdC40LUg0Lgg0L/RgNC40LLQtdC00LXQvdC40LUg0Log0YbQtdC70L7QvNGDCglwcmludGYoInJlc3VsdEFEQzolZCBvdXRwdXRSZXN1bHQ6JWRcbiIsIChpbnQpcmVzdWx0QURDLCAoaW50KW91dHB1dFJlc3VsdCk7Cn0KCnZvaWQgdGVzdF9hZGModWludDE2X3QgeCkgewoJcHJpbnRmKCJzZXQgcmVzdWx0QURDIHRvOiAlZFxuIiwgKGludCl4KTsKCXJlc3VsdEFEQyA9IHg7Cglmb3IgKGludCBpID0gMDsgaSA8IDUwOyBpKyspIHNtb290aF9jeWNsZSgpOwp9CgppbnQgbWFpbih2b2lkKSB7CglTX0lJUiA9IDA7CgkKCXRlc3RfYWRjKDUpOwoJdGVzdF9hZGMoMyk7CgkKCXJldHVybiAwOwp9Cg==