сигнал ШИМ и как его обрабатывать.

sp34
Offline
Зарегистрирован: 05.03.2013

Имеется высокий уровень - режим 1 относительно которого формируются отрицательные ШИМ импульсы частотой 528 Hz и длительностью 1 ms режим 2 далее на этойже частоте меняется скважность на 0.1 ms режим 3 

Вопрос:

1.Каким входом лучше считывать этот сигнал ( аналоговым или цифровым )

2.Как в программе прописать эти импульсы и приравнять к  режимам : 

а - режим 1  Высокий уровень нет ШИМ = 0

в - режим 2  ШИМ 528 гц 1 мс = 1

с - режим 3 ШИМ 528 гц 0.1 мс = 2

maksim
Offline
Зарегистрирован: 12.02.2012
sp34
Offline
Зарегистрирован: 05.03.2013

т.е как я понял мы ограничены частотой 244 гц - выходит надо попробовать RC цепочку расчитать и подключить к аналоговуму входу , ну а дальше дело техники. ТАК ?

maksim
Offline
Зарегистрирован: 12.02.2012

Так вам нужно генерить ШИМ или считывать ШИМ ?

sp34
Offline
Зарегистрирован: 05.03.2013

Считывать ,  все как в первом сообщении.

maksim
Offline
Зарегистрирован: 12.02.2012

Тогда либо пользуетесь внешними прерываниями и micros(), либо функцией pulseIn().

sp34
Offline
Зарегистрирован: 05.03.2013

Уровень оказался 12в - поэтому собрал делитель напряжения на двух резисторах , затем высокочастотный фильтр , далее диод для выделения положительной синусоиды и низкочастотный фильтр для небольшого аккумулирования импульсов - подключив все к аналоговуму входу получил через мониториг такие показания : 0-7 нет сигнала , 65-100 есть сигнал с минимальной скважносью и 120-200 - сигнал с большим периудом скважности все на частоте 528 гц.

Написал условие , все работает !

maksim
Offline
Зарегистрирован: 12.02.2012

А можно было обойтись одним делителем....

sp34
Offline
Зарегистрирован: 05.03.2013

А с аналоговым входом можно .... у меня не осталось цифровых свободных.

Если да то подскажите , пока я все на макетке нагородил ( 8 компонентов ) и на печатку не перенес.

maksim
Offline
Зарегистрирован: 12.02.2012

Аналоговый вход может работать как цифровой. Подключите только делитель и посмотрите что в мониторе

void setup() 
{
  Serial.begin(9600);
}

void loop() {
  Serial.println(pulseIn(A0, LOW, 3000));
}

 

sp34
Offline
Зарегистрирован: 05.03.2013

Сейчас попробую !

sp34
Offline
Зарегистрирован: 05.03.2013

Получаю : 

Высокий уровень на входе А0 - на мониторенге - 0 

Короткие отрицательные импульсы на А0 - на мониторенге 35-37  

Длинные отрицательные импульсы на А0 - на мониторенне  565-575

Намного стабильнее получается , жаль смайликов нет Я ВАМ ОЧЕНЬ БЛАГОДАРЕН !!!

Условие выгледело как: 

 Led_1 = analogRead(A0);

if(Led_1>=0&&Led_1<10)

XXXXXXXXXXXX

if(Led_1>=10&&Led_1<100)

XXXXXXXXXXXX

А как теперь должно выглядеть условие ?

 

maksim
Offline
Зарегистрирован: 12.02.2012
long Led_1 = pulseIn(A0, LOW, 3000);

if(Led_1 == 0)
{
  // а - режим 1  Высокий уровень нет ШИМ = 0
}
else if(Led_1 > 560 && Led_1 < 580)
{
  // в - режим 2  ШИМ 528 гц 1 мс = 1
}
else if(Led_1 > 30 && Led_1 < 40)
{
  // с - режим 3 ШИМ 528 гц 0.1 мс = 2
}
else
{
  // ОШИБКА
}

 

sp34
Offline
Зарегистрирован: 05.03.2013

Получается если мне не понадобиться один из режимов , то 3-х этажный else не нужен ?  и мне можно оставить все как у меня прописано ?

long в примере по ссылке прописан за пределами Loop , я прописал внутри как на примере выше - есть разница ?

И последнее почему именно 3000 мс

maksim
Offline
Зарегистрирован: 12.02.2012

sp34 пишет:

long в примере по ссылке прописан за пределами Loop , я прописал внутри как на примере выше - есть разница?

В вашем случае думаю нет.

sp34 пишет:
И последнее почему именно 3000 мс

ШИМ 528 гц, 1 / 528 = 0,001894 сек или 1894 микросекунды 3000 с запасом, можно и 2000 поставить.

sp34
Offline
Зарегистрирован: 05.03.2013

Спасибо большое!!!  все очень понятно , будем изучать дальше ....

sp34
Offline
Зарегистрирован: 05.03.2013

ххххх