Форум РадиоКот 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: Как получить ШИМ на втором выходе с инверсией |
А что, собственно не получилось то? Если по первому варианту... |
Автор: | 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. Добавим для второго канала равенство с первым и инверсию. ![]() Код: 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) { } }
|
Автор: | 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, спасибо вам огромное. Без вашей помощи я бы точно не разобрался. Для таких как я, начинающих, выложу исходник с прошивкой и протеус.
|
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |