Например TDA7294

Форум РадиоКот :: Просмотр темы - Как получить ШИМ на втором выходе с инверсией
Форум РадиоКот
https://radiokot.ru/forum/

Как получить ШИМ на втором выходе с инверсией
https://radiokot.ru/forum/viewtopic.php?f=57&t=189542
Страница 1 из 1

Автор:  Alex_ka [ Вс авг 13, 2023 10:53:40 ]
Заголовок сообщения:  Как получить ШИМ на втором выходе с инверсией

Есть аппаратный ШИМ на атмега 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 [ Вт авг 15, 2023 12:38:30 ]
Заголовок сообщения:  Re: Как получить ШИМ на втором выходе с инверсией

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

Автор:  Alex_ka [ Вт авг 15, 2023 20:40:42 ]
Заголовок сообщения:  Re: Как получить ШИМ на втором выходе с инверсией

Вариант 1: инверсию можно вывести на OC1B, записав "11" в COM1B1:COM1B0
Спасибо за ответ. Пробовал разные варианты, в том числе и такой, не прокатывает. У меня там Атмега 168, где надо шим с инверсией, но я хотел понять суть работы на 8. Неужели программный писать?

Автор:  Engineer_Keen [ Ср авг 16, 2023 12:22:13 ]
Заголовок сообщения:  Re: Как получить ШИМ на втором выходе с инверсией

А чем железный инвертор не устраивает?

Автор:  Jack_A [ Ср авг 16, 2023 16:44:07 ]
Заголовок сообщения:  Re: Как получить ШИМ на втором выходе с инверсией

Лишняя деталь. Потребление. Габариты. Это если собираться к Луне и каждый грамм на учёте.

Автор:  aleksey chilov [ Ср авг 16, 2023 18:19:35 ]
Заголовок сообщения:  Re: Как получить ШИМ на втором выходе с инверсией

Согласен. Первый проект. Ну сейчас всё работает.

Автор:  Alex_ka [ Ср авг 16, 2023 18:58:43 ]
Заголовок сообщения:  Re: Как получить ШИМ на втором выходе с инверсией

А чем железный инвертор не устраивает?

Есть заводской блок, у которого накрылся МК 168, у него несколько частот выход. На выходе 420, 480, 720, 780 Гц. Но с выхода портов PD3 и PD5, частота идёт на драйвера с инверсией и шимом регулируется выходное напряжение.

Автор:  Engineer_Keen [ Чт авг 17, 2023 08:45:41 ]
Заголовок сообщения:  Re: Как получить ШИМ на втором выходе с инверсией

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

Кстати, на эти выводы работают таймеры 0 и 2, у них нет режима Phase and Frequency Correct, он есть только у 16-битного таймера 1.

Автор:  Alex_ka [ Чт авг 17, 2023 10:31:44 ]
Заголовок сообщения:  Re: Как получить ШИМ на втором выходе с инверсией

Я не собираюсь переделывать. Мне проще разбираться на 8 атмеге как это сделать, потом перенесу на 168. Он там по любому аппаратный, так как порты на выходе OC0B и OC2B.

Автор:  Engineer_Keen [ Чт авг 17, 2023 12:48:54 ]
Заголовок сообщения:  Re: Как получить ШИМ на втором выходе с инверсией

А что, собственно не получилось то? Если по первому варианту...

Спойлер
Вложение:
2pwm.PNG [90.34 KiB]
Скачиваний: 56

Автор:  Alex_ka [ Чт авг 17, 2023 16:43:03 ]
Заголовок сообщения:  Re: Как получить ШИМ на втором выходе с инверсией

Подскажи пожалуйста как это у тебя получилось? Если можно, какой кусок программы надо добавить? Я просто около года только занимаюсь программированием и то не каждый день, по наличию свободного времени. Извини. Но для меня понятный, это язык СИ. В ассемблере, я как баран.

Автор:  Engineer_Keen [ Чт авг 17, 2023 21:41:28 ]
Заголовок сообщения:  Re: Как получить ШИМ на втором выходе с инверсией

Тут ничего сложного, программа 1 в 1 как в первом посте, только как я и говорил, добавлены "1" в биты COM1B1 и COM1B0, ну и вместо прямой записи констант в регистры, я их рассчитал заранее (частота ШИМ и процент заполнения).
Если убрать макрос OUTI и далее вместо запятой разделяющей имя регистра и его значение поставить "=", то получится тот же код на Си.

Автор:  Alex_ka [ Пт авг 18, 2023 07:43:46 ]
Заголовок сообщения:  Re: Как получить ШИМ на втором выходе с инверсией

Тут ничего сложного, программа 1 в 1 как в первом посте, только как я и говорил, добавлены "1" в биты COM1B1 и COM1B0.
Я этот вариант пробовал и ещё раз на всякий случай перепроверил. На СИ не прокатывает, чего-то не хватает. Вот чего, понять не могу. Ещё раз даташит посмотрю, может где что-то упустил и не прописал в регистре, чтобы СОМ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 [ Пт авг 18, 2023 08:38:19 ]
Заголовок сообщения:  Re: Как получить ШИМ на втором выходе с инверсией

SPL-SPH это регистр указателя стека, в ассемблере его надо инициализировать, в Си оно само...
SBI это установка бита в регистре, да в данном случае это порты на выход, LOOP - просто метка, RJMP PC это пустой вечный цикл (переход на адрес, а PC - это как раз текущий адрес), если ничего делать не надо.
А вот чего у вас еще нет, так это загрузки во второй регистр сравнения OCR1B, он как раз определяет заполнение ШИМ на втором канале! Туда надо загрузить то же что и в OCR1A.

Автор:  veso74 [ Пт авг 18, 2023 08:44:52 ]
Заголовок сообщения:  Re: Как получить ШИМ на втором выходе с инверсией

Пример ШИМ из 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 KiB]
Скачиваний: 50

Автор:  Alex_ka [ Пт авг 18, 2023 10:52:40 ]
Заголовок сообщения:  Re: Как получить ШИМ на втором выходе с инверсией

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

Добавлено after 1 hour 22 minutes 24 seconds:
Выше указанный ШИМ в архиве zip только с частотой 8 мГц работает нормально. Если на 8 мГц я включаю WGM13, а отключаю 10 и 11, то длительность тоже нормальная, но идёт подёргивание сигнала на двух портах.Вечером на другом ноуте скомпилирую на 8 и 10 мГц и посмотрю, что получается. А то может на этом какой косяк лезет.

Автор:  veso74 [ Пт авг 18, 2023 11:23:11 ]
Заголовок сообщения:  Re: Как получить ШИМ на втором выходе с инверсией

Поменял клок с внутреннего генератора 8 MHz на кварцевого генератора 11.0592 MHz и на 18.432 MHz.
Ничего не изменилось с длительности. Ищите причину.

Автор:  Alex_ka [ Пт авг 18, 2023 19:17:23 ]
Заголовок сообщения:  Re: Как получить ШИМ на втором выходе с инверсией

Ищите причину.
Спасибо разобрался. Нетбук у меня косячит, скорее всего из-за того. что пару дней назад разбирался с прошивками по восстановлению диагностического шнурка VCDS и загрузил инсталлер. который сделал мне 480 изменений реестра, еле удалил всё и почистил. Если кого интересует, то могу сказать, что в инете хрень, а не еепром выложены. Флеши с разными версиями там рабочие. Более подробно через личку. Возможно кривая чистка реестра. Теперь надо будет винду сносить. На ноуте никаких подёргиваний сигнала нет, даже при активированном WGM13, остальные в нулях. А мой косяк по длительности между портами из-за того, что при управлении кнопками плюс и минус заполнение ШИМ надо одинаково прописывать как OCR1A, так и OCR1B. А у меня было прописано только управление OCR1A. Тогда и длительность сигнала и пауза будет одинакова на двух портах в инверсии. veso74, Engineer_Keen, спасибо вам огромное. Без вашей помощи я бы точно не разобрался. Для таких как я, начинающих, выложу исходник с прошивкой и протеус.

Вложения:
2PWM.rar [16.69 KiB]
Скачиваний: 50

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/