Реализация ШИМ.

Анастас
Offline
Зарегистрирован: 18.11.2017

Доброе время суток. Подскажите кто ни будь, есть ли возможность в Ардуино Уно инвертировать сигнал PWM. Установку элемента "НЕ" прошу не предлагать. Заранее спасибо.

 

 

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

прямой - analogWrite(pin, x)
инверсный - analogWrite(pin, 255 - x)

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Вариант НЕ не предлагаю 

analogWrite(pin, ~x);

 

Анастас
Offline
Зарегистрирован: 18.11.2017

Спасибо большое .за совет, попробую

Анастас
Offline
Зарегистрирован: 18.11.2017

Не получается получить инверсию. Дело в том мне нужен ШИМ с регулировкой скважности. На низкой частоте получить инверсию удалось, но нет регулировки скважности. А на высокой частоте даже инверсия не получается. Я использую протеус для симулирования.

Анастас
Offline
Зарегистрирован: 18.11.2017
#include <TimerOne.h>
int pwmPinF = 9;
int pwmPinB = 10;
int analogPin = 0;
int val = 0;
int i; 
void setup()
{
  pinMode (10, OUTPUT); 
  pinMode (9, OUTPUT);
  Timer1.initialize(33);
  Timer1.pwm(9, 255);
  Timer1.pwm(10, 255);
 
}
void loop()
{
 
  {
   analogWrite(9, 255-0 );
   analogWrite(10, 0-255);  
  }
  
  {
  val = analogRead(analogPin);
  analogWrite (9, val / 4);
  analogWrite (10, val / 4);
  }
}

 

Анастас
Offline
Зарегистрирован: 18.11.2017

Анастас пишет:

Вот этот код. 

#include <TimerOne.h>
int pwmPinA = 9;
int pwmPinB = 10;
int analogPin = 0;
int val = 0;
int i; 
void setup()
{
  pinMode (10, OUTPUT); 
  pinMode (9, OUTPUT);
  Timer1.initialize(33);
  Timer1.pwm(9, 255);
  Timer1.pwm(10, 255);
 
}
void loop()
{
 
  {
   analogWrite(9, 255-0 );
   analogWrite(10, 0-255);  
  }
  
  {
  val = analogRead(analogPin);
  analogWrite (9, val / 4);
  analogWrite (10, val / 4);
  }
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Анастас пишет:

Я использую протеус для симулирования.

Ну, так не используйте.

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Анастас пишет:
Не получается получить инверсию.

Что, по-вашему, есть инверсия ШИМ?

Цитата:
Я использую протеус для симулирования.

Используйте, лучше, осциллограф ))

Зачем Вам это?
Timer1.pwm(10, 255);

почему не
analogWrite(10, 255);

Анастас
Offline
Зарегистрирован: 18.11.2017

ЕвгенийП]</p> <p>[quote=Анастас пишет:

Я использую протеус для симулирования.

Ну, так не используйте.

Я спрашиваю тех кто знает, а не тех даёт идиотские советы. Извините, но по другому ваш ответ не могу комментировать.

Анастас
Offline
Зарегистрирован: 18.11.2017

Я недавно начал изучать программирование, поэтому и спрашиваю, есть ли в ардуино уно возможность использовать комплементарный ШИМ. А то что мне удалось получить, вернее громко сказано, что удалось нашёл код в инете, в нем скважность можно регулировать тольс помощью установок таймера.

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Если почитаете тут, то увидите, что никаких таймеров в вашем случае не требуется.
Второй аргумент ф-ии analogWrite в диапазоне от 0 до 255 задаёт скважность ШИМ.

Вы, таки, правда хочете получить отрицательный ШИМ?
analogWrite(10, 0-255);

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Анастас пишет:
Извините, но по другому ваш ответ не могу комментировать.
И совершенно напрасно. Proteus очень плохо моделирует эти процессы (вернее нуждается для этого в нетривиальной настройке), и если Вы будете пользоваться им, то только наживёте себе лишних проблем. Потому, я Вам дал дельный совет, не использовать здесь протеус. Вы ж обозвали меня идиотом. Спасибо, впредь постараюсь воздержваться от помощи Вам, чтобы не нарваться. Всего доброго.

Анастас
Offline
Зарегистрирован: 18.11.2017

Осциллографа под рукой нет, и вообще нахожусь в Индии, решил заняться программированием на старости лет. Под рукой только комп. Ардуино у зятя на фирме. Не хочу отвлекать от работы.

 

evgta
Offline
Зарегистрирован: 02.09.2016

есть такое, протеус редко когда может аппаратный шим моделировать

Анастас
Offline
Зарегистрирован: 18.11.2017

А вы сами как отреагировали на такой ответ. А насчёт протеуса вы не правы, уж инвертированный сигнал худо бедно он покажет, я уже давно пользуюсь протеусом, правда с микроконтроллерами не имел дела. Прошу прощения конечно за резкий ответ, но на форумах столько оскорблений услышишь, а дельных советов никак. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Анастас пишет:

Осциллографа под рукой нет

И это, конечно, достаточная причина назвать меня идиотом за нормальный, совершенно по делу совет. Валяйте дальше, успехов! Надеюсь, Вам кто-нибудь объяснит, как заставить Протеус нормально промоделировать этот процесс.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Анастас пишет:

А насчёт протеуса вы не правы

Вам виднее.

Анастас
Offline
Зарегистрирован: 18.11.2017

Мне главное знать есть такая возможность в Ардуино уно или нет. Здесь не у кого спросить не настолько хорошо знаю английский, чтобы мне доходчиво объяснили, можно сказать варюсь в собственном соку. Только пару месяцев как занялся изучением программирования. А в 59 лет уже тяжеловато воспринимается, но по чайной ложечке уже кое что познал. 

Анастас
Offline
Зарегистрирован: 18.11.2017

Возможно я ошибаюсь, может придётся реальным ардуино воспользоваться. Если что напишу. Спасибо за совет, ещё раз прошу прощения, беру слова обратно.

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014
Попробуйте в Протеусе это -

#define pwmPinF  9
#define pwmPinB 10
#define analogPin A0
int val = 0;
int new_val = 0;

void setup() {
   //начальное значение ШИМ
   analogWrite(pwmPinF, 255);
   analogWrite(pwmPinB, 255); 
}

void loop() {
   new_val = analogRead(analogPin);
   new_val = map (new_val, 0, 1023, 0, 255);
   if (new_val != val) {
         val = new_val;
         analogWrite(10, new_val); //прямой ШИМ
         analogWrite(9, 255 - new_val); //инверсный
   }
}
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Протеус можно настроить, чтобы он всё показал.

Там проблема возникает когда настройка Timestep per Frame совпадает (или кратна) частоте процесса. Тогда получается, что протеус может считать точки, которые попадают на те же самые места в сигнале (допустим, только на high-участки) и тогда протеус просто не заметит сигнала. Если такая беда случчилась, надо просто поменять Timestep. Вот здесь (в разделе 4.6) есть описание аналогичной проблемы только для низких частот (для переменного тока), но суть та же. При умолчательных настройках протеуса, такая проблема возникает как раз на частоте 500 Гц (а стандартный ШИМ - 490), потому там частенько появляется беда.

evgta
Offline
Зарегистрирован: 02.09.2016

ХЗ , но у меня протеус без дополнительных настроек что 490HZ что 25KHz нехотел симулировать, пришлось в живую проверять

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Поставил Протеус 8, настройки дефолтные. Такой скетч -

int val = 20;

void setup() {
    analogWrite(10, val);
    analogWrite(9, 255 - val);
}

void loop() {

}

Результат -

evgta
Offline
Зарегистрирован: 02.09.2016

а теперь добавьте строчек 50 кода и шим перестанет работать