Преобразователь частоты ШИМ
- Войдите на сайт для отправки комментариев
В общем, задача такая: имеется датчик, выдающий ШИМ-сигнал частотой 760 Герц с заполнением 0-90 процентов. Требуется получить ШИМ-сигнал такого же заполнения, но частотой 200 Герц. Я разработал два решения, но ни одно из них не работает.
Решение 1: самое простое - считаем длину импульса через pulseIn();, умножаем её ~на 4 и пишем digitalWrite, потом - пауза вычисленной длины.
Не работает, т.к. операции чтения занимают слишком много времени, не получается уложиться в паузу
Решение 2: простейший ЦАП - RC-фильтр, ОУ и на аналоговый вход. Если делать analogRead циклом в 100 итераций, то получается очень даже сносно, разброс порядка 1%, вполне допустимо. Потом полученное значение забиваем в analogWrite, и... получаем частоту 490 Гц. А надо 200. Надо другой предделитель.
Посоветуйте, пожалуйста, куда копать.
P.S. забыл приложить мой код (хотя, вряд ли он правильный)
Решение 1:
static byte sensor = 2; static byte output = 3; void setup(void) { DDRD &= ~(1<<2); // порт 2 - вход DDRD |= 1<<3; // порт 3 - выход } void loop(void) { unsigned int pulse = pulseIn(sensor, LOW, 2000); unsigned int pause = pulseIn(sensor, HIGH, 2000); PORTD |= 1<<3; delayMicroseconds(pulse*4); PORTD &= ~(1<<3); delayMicroseconds(5000-pulse*4); }Решение 2:
int outpin = 3; void setup() { pinMode(outpin, OUTPUT); } void loop() { unsigned int average = 0; unsigned int sensorValue = 0; for(int i=0; i < 100; i++) { sensorValue = analogRead(0); average = average + sensorValue; } sensorValue = average/100; unsigned char percentage = 88 - sensorValue/6; analogWrite(outpin, percentage*2.55); }