DMC.33 · Датчики · ATmega328P
Задача
Оценить уровень вибраций как размах/дисперсию показаний акселерометра за окно.
Алгоритм
Собрать N выборок, найти max-min (размах) по оси; большой размах = сильные вибрации, индикация светодиодом.
Исходный код (C, avr-gcc)
⇩ Скачать 33-vibration-level.c
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#include <avr/io.h>
#include <util/delay.h>
int main(void){
DDRB|=(1<<PB5);
volatile int16_t sample=0; // подставить реальное чтение акс.
for(;;){
int16_t mn=32767, mx=-32768;
for(uint8_t i=0;i<32;i++){ int16_t s=sample; if(s<mn)mn=s; if(s>mx)mx=s; _delay_ms(2); }
int16_t span=mx-mn;
if(span>2000) PORTB|=(1<<PB5); else PORTB&=~(1<<PB5); // порог вибраций
_delay_ms(50);
}
}
Сборка: avr-gcc -mmcu=atmega328p -DF_CPU=16000000UL -Os файл.c -o файл.elf
Пояснения
Помогает выявить дисбаланс винтов и плохую виброразвязку до порчи видео. Данные здесь условные.