Как получить ШИМ на втором выходе с инверсией

Обсуждаем контроллеры компании Atmel.
Ответить
Alex_ka
Нашел транзистор. Понюхал.
Сообщения: 193
Зарегистрирован: Ср сен 04, 2019 17:59:23
Откуда: Гомель

Как получить ШИМ на втором выходе с инверсией

Сообщение Alex_ka »

Есть аппаратный ШИМ на атмега 8, который реализован PWM, Phase and Frequency, пункт 8 по даташиту. Как получить эту частоту ШИМ на любом другом выводе МК с инверсией. Коротко о программе.
TCCR1A |= (1<<COM1A1);
TCCR1A &= ~(1<<COM1A0);
TCCR1A &= ~(1<<WGM10);
TCCR1A &= ~(1<<WGM11);
TCCR1B &= ~(1<<WGM12);
TCCR1B |= (1<<WGM13);
TCCR1B |= (1<<CS10);
TCCR1B &= ~(1<<CS11);
TCCR1B &= ~(1<<CS12);
ICR1 = 645;
OCR1A = 340;
Реклама
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Как получить ШИМ на втором выходе с инверсией

Сообщение Engineer_Keen »

Мега8 очень примитивный контроллер по нынешним меркам, никаких возможностей по переназначению портов для периферии там нет, так что на ЛЮБОЙ ДРУГОЙ вывод железно ШИМ не вывести.
Вариант 1: инверсию можно вывести на OC1B, записав "11" в COM1B1:COM1B0
Вариант 2: в главном цикле тупо проверять OC1A и инвертируя его, выводить на требуемый пин, естественно, никакой Phase/Frequency Correct тут не будет, особенно если есть длинные прерывания или другие подпрограммы
Вариант 3: попробовать сделать то же что и в В2, но через прерывания, отслеживать придется и OCR и OVF и переключать вывод в соответствии с алгоритмом режима 8. Результат будет немного получше чем в В2
Вариант 4: тупо поставить инвертор на OC1A (да хоть на транзисторе), сэкономив вывод контроллера и освободив его от лишних вычислений
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Реклама
Alex_ka
Нашел транзистор. Понюхал.
Сообщения: 193
Зарегистрирован: Ср сен 04, 2019 17:59:23
Откуда: Гомель

Re: Как получить ШИМ на втором выходе с инверсией

Сообщение Alex_ka »

[uquote="Engineer_Keen",url="/forum/viewtopic.php?p=4462435#p4462435"]Вариант 1: инверсию можно вывести на OC1B, записав "11" в COM1B1:COM1B0[/uquote]Спасибо за ответ. Пробовал разные варианты, в том числе и такой, не прокатывает. У меня там Атмега 168, где надо шим с инверсией, но я хотел понять суть работы на 8. Неужели программный писать?
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Как получить ШИМ на втором выходе с инверсией

Сообщение Engineer_Keen »

А чем железный инвертор не устраивает?
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6321
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Как получить ШИМ на втором выходе с инверсией

Сообщение Jack_A »

Лишняя деталь. Потребление. Габариты. Это если собираться к Луне и каждый грамм на учёте.
Изображение
Реклама
aleksey chilov
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Вс мар 27, 2022 09:38:17

Re: Как получить ШИМ на втором выходе с инверсией

Сообщение aleksey chilov »

Согласен. Первый проект. Ну сейчас всё работает.
Реклама
Alex_ka
Нашел транзистор. Понюхал.
Сообщения: 193
Зарегистрирован: Ср сен 04, 2019 17:59:23
Откуда: Гомель

Re: Как получить ШИМ на втором выходе с инверсией

Сообщение Alex_ka »

[uquote="Engineer_Keen",url="/forum/viewtopic.php?p=4462955#p4462955"]А чем железный инвертор не устраивает?[/uquote]
Есть заводской блок, у которого накрылся МК 168, у него несколько частот выход. На выходе 420, 480, 720, 780 Гц. Но с выхода портов PD3 и PD5, частота идёт на драйвера с инверсией и шимом регулируется выходное напряжение.
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Как получить ШИМ на втором выходе с инверсией

Сообщение Engineer_Keen »

Ну так без переделки схемы восьмая мега туда и не пойдет, если ШИМ не программно делать, у нее на DP3/PD5 вообще ШИМ не выводится. Вот у 168 там да, выходы железной ШИМ, причем от разных таймеров.

Кстати, на эти выводы работают таймеры 0 и 2, у них нет режима Phase and Frequency Correct, он есть только у 16-битного таймера 1.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Alex_ka
Нашел транзистор. Понюхал.
Сообщения: 193
Зарегистрирован: Ср сен 04, 2019 17:59:23
Откуда: Гомель

Re: Как получить ШИМ на втором выходе с инверсией

Сообщение Alex_ka »

Я не собираюсь переделывать. Мне проще разбираться на 8 атмеге как это сделать, потом перенесу на 168. Он там по любому аппаратный, так как порты на выходе OC0B и OC2B.
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Как получить ШИМ на втором выходе с инверсией

Сообщение Engineer_Keen »

А что, собственно не получилось то? Если по первому варианту...
Спойлер
2pwm.PNG
(90.34 КБ) 76 скачиваний
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Alex_ka
Нашел транзистор. Понюхал.
Сообщения: 193
Зарегистрирован: Ср сен 04, 2019 17:59:23
Откуда: Гомель

Re: Как получить ШИМ на втором выходе с инверсией

Сообщение Alex_ka »

Подскажи пожалуйста как это у тебя получилось? Если можно, какой кусок программы надо добавить? Я просто около года только занимаюсь программированием и то не каждый день, по наличию свободного времени. Извини. Но для меня понятный, это язык СИ. В ассемблере, я как баран.
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Как получить ШИМ на втором выходе с инверсией

Сообщение Engineer_Keen »

Тут ничего сложного, программа 1 в 1 как в первом посте, только как я и говорил, добавлены "1" в биты COM1B1 и COM1B0, ну и вместо прямой записи констант в регистры, я их рассчитал заранее (частота ШИМ и процент заполнения).
Если убрать макрос OUTI и далее вместо запятой разделяющей имя регистра и его значение поставить "=", то получится тот же код на Си.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Alex_ka
Нашел транзистор. Понюхал.
Сообщения: 193
Зарегистрирован: Ср сен 04, 2019 17:59:23
Откуда: Гомель

Re: Как получить ШИМ на втором выходе с инверсией

Сообщение Alex_ka »

[uquote="Engineer_Keen",url="/forum/viewtopic.php?p=4463752#p4463752"]Тут ничего сложного, программа 1 в 1 как в первом посте, только как я и говорил, добавлены "1" в биты COM1B1 и COM1B0.[/uquote]Я этот вариант пробовал и ещё раз на всякий случай перепроверил. На СИ не прокатывает, чего-то не хватает. Вот чего, понять не могу. Ещё раз даташит посмотрю, может где что-то упустил и не прописал в регистре, чтобы СОМ1В заработал. А что означает команда SPL и SPH? SBI я так понял, это порты как выход, а Loop RJMP это возврат на адрес 0026? Всё остальное у меня на СИ прописано как у вас. У вас на ассемблере пашет второй канал, а у меня на СИ не хочет.

// Port B initialization
// Func7=In Func6=In Func5=In Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=T State6=T State5=T State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0x1F;

TCCR1A |= (1<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (1<<COM1B0);
TCCR1B |= (1<<WGM13) | (1<<CS10);
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1A = 340;
ICR1 = 645;
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Как получить ШИМ на втором выходе с инверсией

Сообщение Engineer_Keen »

SPL-SPH это регистр указателя стека, в ассемблере его надо инициализировать, в Си оно само...
SBI это установка бита в регистре, да в данном случае это порты на выход, LOOP - просто метка, RJMP PC это пустой вечный цикл (переход на адрес, а PC - это как раз текущий адрес), если ничего делать не надо.
А вот чего у вас еще нет, так это загрузки во второй регистр сравнения OCR1B, он как раз определяет заполнение ШИМ на втором канале! Туда надо загрузить то же что и в OCR1A.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
veso74
Поставщик валерьянки для Кота
Сообщения: 1916
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: Как получить ШИМ на втором выходе с инверсией

Сообщение veso74 »

Пример ШИМ из PWM On The ATmega8.
Добавим для второго канала равенство с первым и инверсию.

Изображение

Код: Выделить всё

#include <avr/io.h>

int main(void) {
  DDRB |= (1 << DDB1) | (1 << DDB2);        // PB1, PB2 is now an output
  
  OCR1A = OCR1B = 0x00FF;                   // set PWM for xx% duty cycle
  
  TCCR1A |= (1 << COM1A1);                  // set none-inverting mode
  TCCR1A |= (1 << COM1B1) | (1 << COM1B0);  // set inverting mode
  
  TCCR1A |= (1 << WGM11) | (1 << WGM10);
  TCCR1B |= (1 << CS11);
  
  while (1) {
  }
}
Вложения
atmega8_pwm.zip
(14.87 КБ) 67 скачиваний
Последний раз редактировалось veso74 Пт авг 18, 2023 11:19:08, всего редактировалось 1 раз.
Alex_ka
Нашел транзистор. Понюхал.
Сообщения: 193
Зарегистрирован: Ср сен 04, 2019 17:59:23
Откуда: Гомель

Re: Как получить ШИМ на втором выходе с инверсией

Сообщение Alex_ka »

Всем огромное спасибо за помощь. Добавил равенство OCR и всё заработало. Но инверсия косая получается на 10 мГц, при WGM13=1, остальные в нулях. Даже если прописать WGM10 и 11 как выше указано, а 13=0, всё равно инверсия неодинаковая по длительности.
Изображение

Добавлено after 1 hour 22 minutes 24 seconds:
Выше указанный ШИМ в архиве zip только с частотой 8 мГц работает нормально. Если на 8 мГц я включаю WGM13, а отключаю 10 и 11, то длительность тоже нормальная, но идёт подёргивание сигнала на двух портах.Вечером на другом ноуте скомпилирую на 8 и 10 мГц и посмотрю, что получается. А то может на этом какой косяк лезет.
veso74
Поставщик валерьянки для Кота
Сообщения: 1916
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: Как получить ШИМ на втором выходе с инверсией

Сообщение veso74 »

Поменял клок с внутреннего генератора 8 MHz на кварцевого генератора 11.0592 MHz и на 18.432 MHz.
Ничего не изменилось с длительности. Ищите причину.
Alex_ka
Нашел транзистор. Понюхал.
Сообщения: 193
Зарегистрирован: Ср сен 04, 2019 17:59:23
Откуда: Гомель

Re: Как получить ШИМ на втором выходе с инверсией

Сообщение Alex_ka »

[uquote="veso74",url="/forum/viewtopic.php?p=4463965#p4463965"]Ищите причину.[/uquote]Спасибо разобрался. Нетбук у меня косячит, скорее всего из-за того. что пару дней назад разбирался с прошивками по восстановлению диагностического шнурка VCDS и загрузил инсталлер. который сделал мне 480 изменений реестра, еле удалил всё и почистил. Если кого интересует, то могу сказать, что в инете хрень, а не еепром выложены. Флеши с разными версиями там рабочие. Более подробно через личку. Возможно кривая чистка реестра. Теперь надо будет винду сносить. На ноуте никаких подёргиваний сигнала нет, даже при активированном WGM13, остальные в нулях. А мой косяк по длительности между портами из-за того, что при управлении кнопками плюс и минус заполнение ШИМ надо одинаково прописывать как OCR1A, так и OCR1B. А у меня было прописано только управление OCR1A. Тогда и длительность сигнала и пауза будет одинакова на двух портах в инверсии. veso74, Engineer_Keen, спасибо вам огромное. Без вашей помощи я бы точно не разобрался. Для таких как я, начинающих, выложу исходник с прошивкой и протеус.
Вложения
2PWM.rar
(16.69 КБ) 70 скачиваний
Ответить

Вернуться в «AVR»