Преобразователь частоты ШИМ

Koldune
Offline
Зарегистрирован: 07.04.2011

В общем, задача такая: имеется датчик, выдающий ШИМ-сигнал частотой 760 Герц с заполнением 0-90 процентов. Требуется получить ШИМ-сигнал такого же заполнения, но частотой 200 Герц. Я разработал два решения, но ни одно из них не работает.

Решение 1: самое простое - считаем длину импульса через pulseIn();, умножаем её ~на 4 и пишем digitalWrite, потом - пауза вычисленной длины.

Не работает, т.к. операции чтения занимают слишком много времени, не получается уложиться в паузу

Решение 2: простейший ЦАП - RC-фильтр, ОУ и на аналоговый вход. Если делать analogRead циклом в 100 итераций, то получается очень даже сносно, разброс порядка 1%, вполне допустимо. Потом полученное значение забиваем в analogWrite, и... получаем частоту 490 Гц. А надо 200. Надо другой предделитель.

Посоветуйте, пожалуйста, куда копать.

Koldune
Offline
Зарегистрирован: 07.04.2011

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); 
            }