Помогите пожалуйста разобраться с ШИМ
-
levpersona
- Открыл глаза
- Сообщения: 64
- Зарегистрирован: Вс мар 10, 2013 01:22:46
Помогите пожалуйста разобраться с ШИМ
Как-то вот по реализации ШИМ на AVR на ассемблере в гугле нашел только статейку с изиелектроникс, но не особо она мне разъяснила интересующие меня вопросы
Необходимо реализовать 4-х канальный ШИМ, для начала на меге 32
период импульсов 20мс исходя из это предположил что необходимо делать ШИМ на основе СТС (хотя могу и ошибаться)
коэффициент заполнения должен меняться исходя из положения переменных резисторов.
Вторую часть пока можно не разъяснять, планирую сначала вручную вводить его так сказать, сделать что б работало так, а после подключать уже ацп.
В общем как реализовать первую часть?
Необходимо реализовать 4-х канальный ШИМ, для начала на меге 32
период импульсов 20мс исходя из это предположил что необходимо делать ШИМ на основе СТС (хотя могу и ошибаться)
коэффициент заполнения должен меняться исходя из положения переменных резисторов.
Вторую часть пока можно не разъяснять, планирую сначала вручную вводить его так сказать, сделать что б работало так, а после подключать уже ацп.
В общем как реализовать первую часть?
- Реклама
Re: Помогите пожалуйста разобраться с ШИМ
1. Настроить таймер на прерывания с периодом 20мс/разрядность ШИМ.
2. Завести четыре переменных для хранения коэффициентов заполнения.
3. Завести переменную счётчик с требуемой разрядностью ШИМ.
4. По каждому прерыванию увеличивать показания счётчика на единицу (при переполнении обнулять).
5. Если в текущем прерывании счётчик =0, то включить все четыре ключа.
6. Сравнить счётчик поочерёдно с коэффициентами заполнения и если счётчик>=К, то выключить соответствующий ключ.
Если принять разрядность = 8 бит, то прерывания должны следовать с периодом 20мс/256 = 0,0000781 с.
Если Мега работает на частоте 8 МГц, то один такт длится 0,000000125 с.
Следовательно прерывания должны следовать каждые 0,0000781/0,000000125=625 тактов.
При использовании 16-битного таймера нужно записать в OCRxA значение 625, переключить таймер в режим CTC по сравнению А и включить прерывание по совпадению с А.
Ну далее так же сложно.
2. Завести четыре переменных для хранения коэффициентов заполнения.
3. Завести переменную счётчик с требуемой разрядностью ШИМ.
4. По каждому прерыванию увеличивать показания счётчика на единицу (при переполнении обнулять).
5. Если в текущем прерывании счётчик =0, то включить все четыре ключа.
6. Сравнить счётчик поочерёдно с коэффициентами заполнения и если счётчик>=К, то выключить соответствующий ключ.
Если принять разрядность = 8 бит, то прерывания должны следовать с периодом 20мс/256 = 0,0000781 с.
Если Мега работает на частоте 8 МГц, то один такт длится 0,000000125 с.
Следовательно прерывания должны следовать каждые 0,0000781/0,000000125=625 тактов.
При использовании 16-битного таймера нужно записать в OCRxA значение 625, переключить таймер в режим CTC по сравнению А и включить прерывание по совпадению с А.
Ну далее так же сложно.
-
levpersona
- Открыл глаза
- Сообщения: 64
- Зарегистрирован: Вс мар 10, 2013 01:22:46
Re: Помогите пожалуйста разобраться с ШИМ
я так понимаю это будет программный, а не аппаратный ШИМ?
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Помогите пожалуйста разобраться с ШИМ
А в 32-ой меге есть 4 канала аппаратных ШИМа ?
-
Pnjom-Penb
- Мучитель микросхем
- Сообщения: 469
- Зарегистрирован: Вс авг 30, 2015 03:52:59
Re: Помогите пожалуйста разобраться с ШИМ
Так ведь контроллер-то уже Вами выбран.levpersona писал(а):я так понимаю это будет программный, а не аппаратный ШИМ?
- Реклама
-
levpersona
- Открыл глаза
- Сообщения: 64
- Зарегистрирован: Вс мар 10, 2013 01:22:46
Re: Помогите пожалуйста разобраться с ШИМ
контроллер может быть любой авровский с 4-мя каналами, просто мега32 как раз по этому параметру подходит=)
-
Pnjom-Penb
- Мучитель микросхем
- Сообщения: 469
- Зарегистрирован: Вс авг 30, 2015 03:52:59
Re: Помогите пожалуйста разобраться с ШИМ
... уже разжевали.
Последний раз редактировалось Pnjom-Penb Пн ноя 23, 2015 10:12:49, всего редактировалось 2 раза.
- eess9
- Вымогатель припоя
- Сообщения: 672
- Зарегистрирован: Ср фев 29, 2012 01:58:32
- Откуда: Харьков, Украина
Re: Помогите пожалуйста разобраться с ШИМ
Если использовать все 3 таймера, то 4 канала ШИМа найдется.
Но это больше из пушки по воробьям.
На тех частотах, которые надо вам, программный ШИМ именно оно.
Но это больше из пушки по воробьям.
На тех частотах, которые надо вам, программный ШИМ именно оно.
-
levpersona
- Открыл глаза
- Сообщения: 64
- Зарегистрирован: Вс мар 10, 2013 01:22:46
Re: Помогите пожалуйста разобраться с ШИМ
считывание данных с ацп, можно будет поместить как раз где-нибудь после каждого периода ШИМ сигнала, правильно понимаю? они не добавят большой задержки?
Re: Помогите пожалуйста разобраться с ШИМ
Сейчас посмотрел даташит и действительно
Timer0 - один ШИМ выход
Timer1 - два
Timer2 - один.
Итого 4-е канала.
Тогда всё проще и программа сводится к загрузке нужных флагов в управляющие регистры.
Timer0 - один ШИМ выход
Timer1 - два
Timer2 - один.
Итого 4-е канала.
Тогда всё проще и программа сводится к загрузке нужных флагов в управляющие регистры.
- eess9
- Вымогатель припоя
- Сообщения: 672
- Зарегистрирован: Ср фев 29, 2012 01:58:32
- Откуда: Харьков, Украина
Re: Помогите пожалуйста разобраться с ШИМ
Прерывание АЦП? Используйте его и будет вам счастье.
Минимальная активность в прерываниях, и проблем с задержками и потерей данных по интерфейсах не будет. Вычитали нужные регистры, установили флаги и покидаем прерывание
Минимальная активность в прерываниях, и проблем с задержками и потерей данных по интерфейсах не будет. Вычитали нужные регистры, установили флаги и покидаем прерывание
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Помогите пожалуйста разобраться с ШИМ
И все 3 таймера занять под это ?
Уже сказали - это как из пушки по воробьям. На таких периодах сделайте программные ШИМы.
Уже сказали - это как из пушки по воробьям. На таких периодах сделайте программные ШИМы.
Re: Помогите пожалуйста разобраться с ШИМ
Просто Вы написали "сделать ШИМ на ассемблере" вот я и подумал, что нужен программный.
В принципе 4-е канала в меге32 почти независимы. Просто два канала Таймера1 не могут иметь разную частоту и фазу.
Прерывание АЦП нежелательно использовать при программном ШИМ. Может возникнуть нестабильность коэффициента заполнения.
Считывание данных с АЦП занимает один такт, но вычисление этих данных - процесс относительно долгий.
Если других задач под таймеры нет, то можно и все занять - какая разница. Зато можно будет использовать прерывания не опасаясь сбить программный ШИМ.
В принципе 4-е канала в меге32 почти независимы. Просто два канала Таймера1 не могут иметь разную частоту и фазу.
Прерывание АЦП нежелательно использовать при программном ШИМ. Может возникнуть нестабильность коэффициента заполнения.
Считывание данных с АЦП занимает один такт, но вычисление этих данных - процесс относительно долгий.
Если других задач под таймеры нет, то можно и все занять - какая разница. Зато можно будет использовать прерывания не опасаясь сбить программный ШИМ.
Последний раз редактировалось Андрей СШ Пн ноя 23, 2015 10:12:45, всего редактировалось 1 раз.
- eess9
- Вымогатель припоя
- Сообщения: 672
- Зарегистрирован: Ср фев 29, 2012 01:58:32
- Откуда: Харьков, Украина
Re: Помогите пожалуйста разобраться с ШИМ
Это вряд ли. Если посмотреть таблицу прерываний, то видно, что приоритет прерывания любого из таймеров выше чем у АЦП.Андрей СШ писал(а):Прерывание АЦП нежелательно использовать при программном ШИМ. Может возникнуть нестабильность коэффициента заполнения.
Re: Помогите пожалуйста разобраться с ШИМ
Прерывания выполняются в порядке - кто первый встал того и тапки, а приоритет имеет значения только если два прерывания возникли одновременно.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Помогите пожалуйста разобраться с ШИМ
Да какие там могут быть опасения и сбои ?
ШИМы - программно на одном таймере.
АЦП спокойненько читаем в основном цикле, со всеми расчётами и преобразованиями. Прочитали, преобразовали в попугаи, обновили задающие скважность переменные.
Не думаю, что ТС'у нужна бешеная скорость чтения АЦП, ибо скважность, зависимая от АЦП, будет меняться максимум через 20 мс.
Задача, обслуживающая ШИМы, в этом случае, боооолее приоритетнее задачи преобразования АЦП.
ШИМы - программно на одном таймере.
АЦП спокойненько читаем в основном цикле, со всеми расчётами и преобразованиями. Прочитали, преобразовали в попугаи, обновили задающие скважность переменные.
Не думаю, что ТС'у нужна бешеная скорость чтения АЦП, ибо скважность, зависимая от АЦП, будет меняться максимум через 20 мс.
Задача, обслуживающая ШИМы, в этом случае, боооолее приоритетнее задачи преобразования АЦП.
- eess9
- Вымогатель припоя
- Сообщения: 672
- Зарегистрирован: Ср фев 29, 2012 01:58:32
- Откуда: Харьков, Украина
Re: Помогите пожалуйста разобраться с ШИМ
Вот два абзаца из даташита:Андрей СШ писал(а):Прерывания выполняются в порядке - кто первый встал того и тапки, а приоритет имеет значения только если два прерывания возникли одновременно.
Спойлер
The lowest addresses in the program memory space are by default defined as the Reset and Interrupt vectors. The complete list of vectors is shown in “Interrupts” on page 59. The list also determines the priority levels of the different interrupts. The lower the address the higher is the priority level. RESET has the highest priority, and next is INT0 – the External Interrupt Request 0.
Similarly, if one or more interrupt conditions occur while the global interrupt enable bit is cleared, the corresponding interrupt flag(s) will be set and remembered until the global interrupt enable bit is set, and will then be executed by order of priority.
А чтобы не было проблем с "гуляньем" ШИМ, не надо долго задерживаться в прерывании от АЦП. Считали результат, флаг взвели и убежали.
Можно, конечно, разрешить прерывания внутри прерывания от АЦП (извините за тавтологию
-
levpersona
- Открыл глаза
- Сообщения: 64
- Зарегистрирован: Вс мар 10, 2013 01:22:46
Re: Помогите пожалуйста разобраться с ШИМ
не получается по прерыванию сравнения переходить в обработчик прерывания. наверное не правильно оформляю таблицу прерываний, но тогда не понимаю как правильно, подскажите где лажа
сейчас пытался добиться, что бы при значении счетчика таймера 0, равном 10, переходило в соответствующий обработчик, последний блок в коде, по итогу переходит на какое-то другое прерывание, только не понимаю на какое
Спойлер
Код: Выделить всё
.include "m32def.inc"
.cseg
.org 0
rjmp Reset
rjmp INT_0
rjmp INT_1
rjmp INT_2
rjmp TIMER2_COMP
rjmp TIMER2_OVF
rjmp TIMER1_CAPT
rjmp TIMER1_COMPA
rjmp TIMER1_COMPB
rjmp TIMER1_OVF
rjmp TIMER0_COMP
rjmp TIMER0_OVF
rjmp UART_RX
rjmp UART_UDRE
rjmp UART_TX
rjmp ANA_COMP
.org INT_VECTORS_SIZE
;Reset:
INT_0:
INT_1:
INT_2:
TIMER2_COMP:
TIMER2_OVF:
TIMER1_CAPT:
TIMER1_COMPA:
TIMER1_COMPB:
TIMER1_OVF:
;TIMER0_COMP:
TIMER0_OVF:
UART_RX:
UART_UDRE:
UART_TX:
ANA_COMP:
reti
reset:
ldi r16, low(ramend)
out spl,r16
ldi r16, high(ramend)
out sph,r16
ldi r16, 0b00001001
out tccr0, r16
ldi r16, 10
out ocr0, r16
ldi r16, 0b00000010
out timsk, r16
out tifr, r16
sei
main:
rjmp main
Timer0_comp:
;cod
retiRe: Помогите пожалуйста разобраться с ШИМ
Распространенная ошибка новичков. Дело в том, что у 32-й Меги вектор занимает 2 слова, так что

-----------------------------
; Ставим плюсы
Код: Выделить всё
JMP
или
RJMP
NOP
-----------------------------
; Ставим плюсы
- Вложения
-
- Vect.JPG
- (39.27 КБ) 496 скачиваний
- НАПАЛМ
- Это не хвост, это антенна
- Сообщения: 1314
- Зарегистрирован: Пт ноя 27, 2009 19:47:13
- Откуда: Казань
Re: Помогите пожалуйста разобраться с ШИМ
А лучше всего выносить таблицу с векторами в отдельный файл.
Спойлер
Код: Выделить всё
// Таблица прерываний вынесена для удобства.
;=== BEGIN "ivectors.inc" ==============
; Тут располагается "таблица векторов на обработчики прерываний" - важнейшая вещь!
; Если про нее забыть, то можно огрести такие неразрешимые глюки, что просто капец. Так что не забываем...
; (Вынесено из общего кода в отдельный файл - для облегчения портирования программы на другой камень...)
;
; КАК СДЕЛАТЬ:
; Скопировать секцию "INTERRUPT VECTORS" из HAL-файла Микроконтроллера (например, "tn85def.inc"),
; Заменить все ".equ" на ".org"... и дописать ко всем точкам входа команду RETI.
; (Это на тот случай, если Прерывание случайно вылезет - чтобы вернуть управление туда, откуда прервалось.)
; ***** INTERRUPT VECTORS ************************************************
; Используем HAL Микроконтроллера "ATmega88PA"
.org INT0addr ; External Interrupt Request 0
reti
.org INT1addr ; External Interrupt Request 1
reti
.org PCI0addr ; Pin Change Interrupt Request 0
reti
.org PCI1addr ; Pin Change Interrupt Request 1
reti
.org PCI2addr ; Pin Change Interrupt Request 2
reti
.org WDTaddr ; Watchdog Time-out Interrupt
reti
.org OC2Aaddr ; Timer/Counter2 Compare Match A
reti
.org OC2Baddr ; Timer/Counter2 Compare Match B
reti
.org OVF2addr ; Timer/Counter2 Overflow
reti
.org ICP1addr ; Timer/Counter1 Capture Event
reti
.org OC1Aaddr ; Timer/Counter1 Compare Match A
reti
.org OC1Baddr ; Timer/Counter1 Compare Match B
reti
.org OVF1addr ; Timer/Counter1 Overflow
reti
.org OC0Aaddr ; TimerCounter0 Compare Match A
reti
.org OC0Baddr ; TimerCounter0 Compare Match B
reti
.org OVF0addr ; Timer/Couner0 Overflow
reti
.org SPIaddr ; SPI Serial Transfer Complete
reti
.org URXCaddr ; USART Rx Complete
RJMP RX_OK
.org UDREaddr ; USART, Data Register Empty
RJMP UD_OK
.org UTXCaddr ; USART Tx Complete
RJMP TX_OK
.org ADCCaddr ; ADC Conversion Complete
RJMP ADC_OK
.org ERDYaddr ; EEPROM Ready
reti
.org ACIaddr ; Analog Comparator
reti
.org TWIaddr ; Two-wire Serial Interface
reti
.org SPMRaddr ; Store Program Memory Read
reti
.org INT_VECTORS_SIZE ; size in words <<Конец таблицы прерываний>>
;=== END "ivectors.inc" ================



