|
ШИМ, сделать три канала? |
|
|
|
 |
Ответов
(1 - 84)
|
Oct 7 2007, 22:42
|
Местный
  
Группа: Свой
Сообщений: 300
Регистрация: 15-03-06
Из: Москва
Пользователь №: 15 284

|
Цитата(rezident @ Oct 8 2007, 02:22)  ps1x, вы партизан, разведчик или попугай?  Что вы заладили можно ли, можно ли? Вас пока еще русским языком просят озвучить требуемые вам параметры ШИМа (период, шаг/количество ступеней и т.п) и предполагаемый способ его реализации: программный или аппаратный? Ни то ни другое. Надо подключить РГБ светодиод, с плавным изменением цвета, и в целом, способ достижения этого мне не важен, важно понять как... А параметры ШИМ 256 уровней 5кГц.
|
|
|
|
|
Oct 8 2007, 06:19
|

Местный
  
Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459

|
Один из вариантов программно так: устанавливаем таймер на нужную частоту.(5кгц) По прерыванию инкрементируем значение переменной (byte) (256). Сравниваем это значение с переменной каждого канала(переменные которые,в нашем случае, задают яркость св.диода). Если значение переменной яркости канала больше/меньше значения инкрементируемой переменной, то выставляем порт в 0/1. Все. Записывая нужные значения в переменные яркости канала получаем нужную нам яркость на св.диоде. Зы: Предвижу замечания по поводу коррекции значений констант для значений яркости..из-за особенностей восприятия свечения глазом.. и т.п. вещи..  но я обьяснил только принцип программной реализации шима.. Будет вопрос по линейности зажигания/гашения диодов обсудим..  Зы2: Для 5кГц 256 значений многовато.. Надо делать меньше значений либо прерываня хотыбы 25кГц.. тогда 100Гц мерцания видно уже не будет.
--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
|
|
|
|
|
Oct 8 2007, 11:38
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(ps1x @ Oct 7 2007, 21:42)  Надо подключить РГБ светодиод, с плавным изменением цвета, и в целом, способ достижения этого мне не важен, важно понять как... А параметры ШИМ 256 уровней 5кГц Вот тут было обсуждение. Вообще, не стесняйтесь пользоваться поиском, многие вопросы на форуме "обсосаны до костей".
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 8 2007, 11:54
|
Местный
  
Группа: Свой
Сообщений: 300
Регистрация: 15-03-06
Из: Москва
Пользователь №: 15 284

|
Цитата(=GM= @ Oct 8 2007, 15:38)  Вот тут было обсуждение. Вообще, не стесняйтесь пользоваться поиском, многие вопросы на форуме "обсосаны до костей". к сожалению, поиск по словам ШИМ и PWM ничего не дал (сдается, ибо слово короткое)
|
|
|
|
|
Oct 8 2007, 12:18
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(ps1x @ Oct 8 2007, 10:54)  к сожалению, поиск по словам ШИМ и PWM ничего не дал (сдается, ибо слово короткое) Да ладно, всё ищется на раз. Я ж вам дал ссылку http://electronix.ru/forum/index.php?showtopic=23143, вы туда ходили? Вот ещё ссылка на телесиси http://www.telesys.ru/wwwboards/mcontrol/1...ges/37530.shtmlТам правда обсуждалась 8-ми канальная шим, ниже приведен кусочек для 3-х каналов, разбирайтесь. Код void interrupt isr(void) { if(--refr) { if(--(chan1)) portb |=0x01; //нога pb0 if(--(chan2)) portb |=0x02; //нога pb1 if(--(chan3)) portb |=0x04; //нога pb2 } else { chan1 = value1; //уставка 1 chan2 = value2; //уставка 2 chan3 = value3; //уставка 3 refr = 255; //счетчик квантов шим portb = 0; //начало шим } }
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 8 2007, 23:48
|
Местный
  
Группа: Свой
Сообщений: 300
Регистрация: 15-03-06
Из: Москва
Пользователь №: 15 284

|
Цитата(=GM= @ Oct 8 2007, 16:18)  Да ладно, всё ищется на раз. Я ж вам дал ссылку http://electronix.ru/forum/index.php?showtopic=23143, вы туда ходили? Вот ещё ссылка на телесиси http://www.telesys.ru/wwwboards/mcontrol/1...ges/37530.shtmlТам правда обсуждалась 8-ми канальная шим, ниже приведен кусочек для 3-х каналов, разбирайтесь. Код void interrupt isr(void) { if(--refr) { if(--(chan1)) portb |=0x01; //нога pb0 if(--(chan2)) portb |=0x02; //нога pb1 if(--(chan3)) portb |=0x04; //нога pb2 } else { chan1 = value1; //уставка 1 chan2 = value2; //уставка 2 chan3 = value3; //уставка 3 refr = 255; //счетчик квантов шим portb = 0; //начало шим } } Да спасибо
|
|
|
|
|
Oct 10 2007, 22:58
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(SasaVitebsk @ Oct 10 2007, 13:25)  Используя таймер 1 и выводы OC1A,B,C с соответствующими регистрами, можно всё это реализовать проще и точнее. Программы практически не будет Сиё называется аппаратный шим(:-). Кстати, Александр, недавно вы упоминали реализацию на си 12 программных шимов с периодом 5 кГц. Сколько разрядов у шима удалось реализовать? Спрашиваю потому, что тоже реализовал 24 канала шим с частотой 6 кГц, правда, на ассемблере. Шим был 8-разрядный, т.е. 256 позиций. Клок 20 МГц.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 11 2007, 09:01
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(=GM= @ Oct 11 2007, 01:58)  Сиё называется аппаратный шим(:-). Кстати, Александр, недавно вы упоминали реализацию на си 12 программных шимов с периодом 5 кГц. Сколько разрядов у шима удалось реализовать? Спрашиваю потому, что тоже реализовал 24 канала шим с частотой 6 кГц, правда, на ассемблере. Шим был 8-разрядный, т.е. 256 позиций. Клок 20 МГц. Там был программно аппаратный ШИМ завинченный под управление двигателями. Точность 3200 в принципе определяется частотой (16М). То есть таким образом при 256 полочках можно теоретически довести частоту до 62кГц. Но в реальности, естественно всё выглядит хуже.  Мне в двигателях не надо находится в произвольном месте ШИМа. Я нахожусь в фиксированных точках синуса. Поэтому практически могу обслуживать любое число двигателей. Это определяется только наличием свободных портов. В 1989 году на однокристалке 1816ве48 (8048) (7МГц) реализовал ДУ для телевизора.  Там был плавный программный ШИМ на 4 канала с частотой 100Гц и 64 ступеньки.  В принципе число каналов ШИМ практически не влияет на характеристики самого ШИМа. На него влияет только производительность процессора и его аппаратные возможности. При построении программного ШИМа неизбежно сталкиваешься с погрешностями на краях. То есть при слишком малых и при слишком больших значениях. Естественно при высокой частоте ШИМа. 2 GM как ты с этим боролся. Я никак. Просто констатировал ошибку.
|
|
|
|
|
Oct 11 2007, 14:00
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(SasaVitebsk @ Oct 11 2007, 08:01)  Там был программно-аппаратный ШИМ завинченный под управление двигателями. Точность 3200 в принципе определяется частотой (16М). То есть таким образом при 256 полочках можно теоретически довести частоту до 62 кГц Кажется, мы друг друга не понимаем(:-). Где там? Что такое точность 3200? Частота до 62 кГц для 12 шим? Программно или аппаратно? Цитата(SasaVitebsk @ Oct 11 2007, 08:01)  Мне в двигателях не надо находится в произвольном месте ШИМа. Я нахожусь в фиксированных точках синуса. Поэтому практически могу обслуживать любое число двигателей. Это определяется только наличием свободных портов Почему только фиксированные точки синуса? Цитата(SasaVitebsk @ Oct 11 2007, 08:01)  В 1989 году на однокристалке 1816ве48 (8048) (7МГц) реализовал ДУ для телевизора.  Там был плавный программный ШИМ на 4 канала с частотой 100Гц и 64 ступеньки.  Александр, это хорошо, можем потом обсудить, но сколько было ступенек для 12 каналов шим, реализованных на си (по ссылке, которую я давал)? Цитата(SasaVitebsk @ Oct 11 2007, 08:01)  В принципе число каналов ШИМ практически не влияет на характеристики самого ШИМа. На него влияет только производительность процессора и его аппаратные возможности. При построении программного ШИМа неизбежно сталкиваешься с погрешностями на краях. То есть при слишком малых и при слишком больших значениях. Естественно при высокой частоте ШИМа Число каналов задаётся разработчиком, как и характеристики шима. Как они могут влиять друг на друга? Что такое погрешности на краях? Цитата(SasaVitebsk @ Oct 11 2007, 08:01)  2 GM как ты с этим боролся. Я никак. Просто констатировал ошибку.  У меня любой из 24-х каналов шима имеет одинаковые характеристики, т.е. 256 ступенек, длительность каждой ступеньки, скажем, 0.7 мкс (по памяти). Первая ступенька всегда 0, а переход может быть на любой ступеньке, нет никаких краёв, а раз краёв нет, то и борьбы нет(:-).
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 11 2007, 22:16
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Тогда мы действительно не понимаем друг друга.  Смотря как ты ШИМ реализовывал. Я реализовывал по прерываниям. Расчитывал как бы таблицу времён-портов. В прерывании перегружал следующую константу таймера и выводил значения портов. В связи с тем, что минимальная разница - одна единица, то длительность прерывания должна быть меньше чем Тшим/Nступеней. Такое построение имеет своё преимущество. Поскольку я первым делом вывожу состояние портов, то погрешность вывода незначительна. Есть и недостаток. В связи с тем, что прерывание занимает значительное время (вход/выход/сохранение контекста/обработка) то достичь высокой частоты ШИМ не удаётся. Можно делать прямым опросом таймера, как я видел в примерах на PIC. Честно говоря такой подход меня не устраивает и я его не применяю. Можно обрабатывать все ступеньки. То есть делать 256 прерываний за период. В принципе метод отличается от первого большей регулярностью и меньшим временем реакции на прерывание. Частота, соответственно будет выше. Правда загруженность процессора будет многократно выше. Пост о котором я писал я реализовывал первым описанным способом. Управлял ШД (делал дробление) Соответственно полную синусоиду мне выводить не было необходимости. В тоже время точность вывода (число ступенек) была 3200. Что тут непонятного?
|
|
|
|
|
Oct 11 2007, 23:01
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(SasaVitebsk @ Oct 11 2007, 22:16)  Смотря как ты ШИМ реализовывал Вот моя базовая процедура, выполняется за 18 МЦ, можно еще укоротить (не буду смущать народ, а то придёт сами знаете кто, и начнёт верещать...) Код ;Процедура формирования 256-точечного 24-канального ШИМа (18МЦ) pwmisr: ld temp,x+ ;обновление out port1,temp ;порта 1 ld temp,x+ ;обновление out port2,temp ;порта 2 ld temp,x+ ;обновление out port3,temp ;порта 3 ld temp,x+ ;новая уставка out TCR0,temp ;для сравнения reti Как видишь, можно обойтись без всяких сохранений контекстов(:-). Для твоего случая, для 12 каналов, время прерывания можно сделать порядка 10 МЦ, т.е. с клоком 20 мег время одной ступеньки будет равно 0.5 мкс, период шим = 256*0.5=128 мкс, следовательно частота шим - 7.8 кГц, это на чистом ассемблере, а у тебя 5 кГц на си, неужто компилятор генерит такой быстрый код? Цитата(SasaVitebsk @ Oct 11 2007, 22:16)  Пост о котором я писал я реализовывал первым описанным способом. Управлял ШД (делал дробление) Соответственно полную синусоиду мне выводить не было необходимости. В тоже время точность вывода (число ступенек) была 3200. Что тут непонятного? Непонятно одно. Если 3200 ступеней, то как получить шим 5 кГц? У тебя время одной ступени будет 200 мкс/3200=62.5 нс, а это примерно один МЦ контроллера.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 12 2007, 05:44
|

Местный
  
Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459

|
Такой вопросик с целью понимания вопроса(тфт  ): Скажите уважаемые коллеги, если у меня 256 ступенек шима и порт я обновляю с частотой 25кГц, то минимальное (суммарное значение длительности импульсов) за 1с получается 1/256с?так? И могу ли я справедливо назвать что шим 25Кгц? зы: делал программный 32-ух канальный шим для управления диодами. 25кГц,256дискрет.
--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
|
|
|
|
|
Oct 12 2007, 08:00
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
18-канальный ШИМ на Мега8 (18.432МГц) для управлениея 6-тью полноцветными светодиодами
T0_OVF: push temp in temp,SREG push temp clc ror rd ror rd cp cval,rR5 //PD2 ror rd cp cval,rB4 //PD3 ror rd cp cval,rG4 //PD4 ror rd cp cval,rR4 //PD5 ror rd cp cval,rB3 //PD6 ror rd cp cval,rG3 //PD7 ror rd cp cval,rR3 //PB0 ror rb cp cval,rB2 //PB1 ror rb cp cval,rB6 //PB2 ror rb cp cval,rG2 //PB3 ror rb cp cval,rG6 //PB4 ror rb cp cval,rR2 //PB5 ror rb clc ror rb ror rb cp cval,rR6 //PC0 ror rc cp cval,rB1 //PC1 ror rc cp cval,rB5 //PC2 ror rc cp cval,rG1 //PC3 ror rc cp cval,rG5 //PC4 ror rc cp cval,rR1 //PC5 ror rc clc ror rc ror rc com rb com rc com rd out PORTB,rb out PORTC,rc out PORTD,rd inc cval andi cval,0x7F ; 127 - уровней, мона убрать - станет 8-бит pop temp out SREG,temp pop temp reti
Инициализация таймера: // Настройка таймера T0 clr temp out TCNT0,temp ldi temp,(1<<PSR10) out SFIOR,temp ldi temp,0x01 out TCCR0,temp ldi temp,(1<<TOIE0) out TIMSK,temp Объявление переменных: // Константы .equ F_CPU = 18432000 .equ USART_SPEED = 19200 // Определения .def rR1 = r1 .def rG1 = r2 .def rB1 = r3 .def rR2 = r4 .def rG2 = r5 .def rB2 = r6 .def rR3 = r7 .def rG3 = r8 .def rB3 = r9 .def rR4 = r10 .def rG4 = r11 .def rB4 = r12 .def rR5 = r13 .def rG5 = r14 .def rB5 = r15 .def rR6 = r16 .def rG6 = r17 .def rB6 = r18 .def temp = r19 .def rb = r20 .def rc = r21 .def rd = r22 .def buf = r23 .def cval = r24
|
|
|
|
|
Oct 12 2007, 08:59
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(=GM= @ Oct 12 2007, 02:01)  Код ;Процедура формирования 256-точечного 24-канального ШИМа (18МЦ) pwmisr: ld temp,x+ ;обновление out port1,temp;порта 1 ld temp,x+ ;обновление out port2,temp;порта 2 ld temp,x+ ;обновление out port3,temp;порта 3 ld temp,x+ ;новая уставка out TCR0,temp;для сравнения reti Как видишь, можно обойтись без всяких сохранений контекстов(:-). Ну ну.. 1. теряем ценный регистр X. 2. не понятно где осуществляется сброс X в начальное состояние. 3. почему TCR0 меняется самым последним? 4. Зачем он вообще меняется (25-й канал)? Функция по тактам возможно и оптимальна, но с т. з. функциональности то, что вы привели - это разрозненные колбасные обрезки.
|
|
|
|
|
Oct 12 2007, 09:29
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата(=GM= @ Oct 12 2007, 02:01)  Вот моя базовая процедура, выполняется за 18 МЦ, можно еще укоротить (не буду смущать народ, а то придёт сами знаете кто, и начнёт верещать...) Код ;Процедура формирования 256-точечного 24-канального ШИМа (18МЦ) pwmisr: ld temp,x+ ;обновление out port1,temp;порта 1 ld temp,x+ ;обновление out port2,temp;порта 2 ld temp,x+ ;обновление out port3,temp;порта 3 ld temp,x+ ;новая уставка out TCR0,temp ;для сравнения reti Это конечно класно. Но вопрос возникает тогда, когда надо подготовить колбаску в озу для выдачи в порт. Это же очень медленно. Т.е. если понадобится изменить заполнение какого-либо канала, то на это нужно потратить очень много времени.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Oct 12 2007, 10:32
|

Местный
  
Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459

|
Цитата(=GM= @ Oct 12 2007, 13:10)  Немного не так. Обновление порта может случиться на любой из ступенек, следовательно, частота 256-ступенчатого шима ровно в 256 раз меньше частоты обновления порта, т.е. 97 Гц. Спасибо! таким образом получается что ШИМ который имеет значение 256 дискрет, и частоту обновления 5Кгц, незя называть 5-ти килогерцовым шимом?  и как тада получается : Цитата Спрашиваю потому, что тоже реализовал 24 канала шим с частотой 6 кГц, правда, на ассемблере. Шим был 8-разрядный, т.е. 256 позиций. Клок 20 МГц. етож 6000*256=1536000 ~1.5МГц! и на 20МГц, да еще и 24 канала? зы:видел гдето что шим можно и на апаратном уарте сделать. (последовательно данные выдвигаем), но тут уже надо 32байта запихнуть в USART на один дискрет.
--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
|
|
|
|
|
Oct 12 2007, 11:20
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(add @ Oct 12 2007, 09:32)  етож 6000*256=1536000 ~1.5МГц! и на 20МГц, да еще и 24 канала? Ну, в ваших терминах, это будет частота обновления трёх 8-ми битных портов одновременно, чтобы получить 24 канала. Программка обработки прерывания 24-канальной шим, которую я привёл выше (см.пост #18), выполняется за 18 МЦ (машинных циклов). Один машинный цикл для клока 20 МГц выполняется за 0.05 мкс. Получается обработка прерывания выполняется за 18*0.05=0.9 мкс. То есть за это время обновляются три порта. Частота обновления портов соответственно будет равна 1/0.9=1.1 МГц, ну а частота шим будет в 256 раз ниже, т.е. 1.1/256=4.3 кГц. Никаких чудес, всё по-честному. (Замечу в скобках, что время выполнения можно ещё малёк подсократить, скажем до 13 МЦ, тогда частота 24-канального шима будет порядка 6 кГц. Цитата(Rst7 @ Oct 12 2007, 08:29)  Это конечно класно. Но вопрос возникает тогда, когда надо подготовить колбаску в озу для выдачи в порт. Это же очень медленно. Т.е. если понадобится изменить заполнение какого-либо канала, то на это нужно потратить очень много времени Да, приём исходных данных и подготовка "колбаски" проводится в фоне и занимает относительно много времени, порядка 2500 МЦ, т.е. 125 мкс. Максимальное занятое время процессора, с учётом времени работы прерываний, составит 148 мкс, в то же время период шим равен 166 мкс. Сиё означает, что есть возможность за ОДИН период шима сменить ВСЕ ДВАДЦАТЬ ЧЕТЫРЕ временные уставки, и еще останется свободными 18 мкс (360 МЦ). Смысла менять уставки чаще, чем период шима, я не вижу(:-) Пока других, более быстрых способов программного формирования многоканальных шим, я не нашёл.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 12 2007, 11:35
|

Местный
  
Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459

|
Цитата(=GM= @ Oct 12 2007, 15:20)  Да, приём исходных данных и подготовка "колбаски" проводится в фоне и занимает относительно много времени, порядка 2500 МЦ, т.е. 125 мкс. Максимальное занятое время процессора, с учётом времени работы прерываний, составит 148 мкс, в то же время период шим равен 166 мкс. Сиё означает, что есть возможность за ОДИН период шима сменить ВСЕ ДВАДЦАТЬ ЧЕТЫРЕ временные уставки, и еще останется свободными 18 мкс (360 МЦ). Смысла менять уставки чаще, чем период шима, я не вижу(:-)
Пока других, более быстрых способов программного формирования многоканальных шим, я не нашёл. Ну в Вашем случае вы подготавливаете "колбаску" вне прерывания.. adnega делает это внутри прерывания.. Есть ли в Вашем способе(скажу что способ вообщем то один и тотже) смысл выносить подготовку "колбаски за прерывание"?В таком случае для экономии времени в прерывании прийдется работать с флагами (события по окончанию обновления "колбаски").. и возможен пропуск момента смены значений? в чем выигрыш? может полагаясь на то что данные выводимые в шим обновляются не так часто? тогда какой смыс так "задирать"частоту"шима?
--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
|
|
|
|
|
Oct 12 2007, 11:45
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Чето я не понял. Как-то это все не стреляет. Общая идея то понятна, и будет работать, но вот цифры не сходятся  Цитата(=GM= @ Oct 12 2007, 14:20)  (Замечу в скобках, что время выполнения можно ещё малёк подсократить, скажем до 13 МЦ, тогда частота 24-канального шима будет порядка 6 кГц. Пусть будет 13 тактов. И еще надо добавить 4 - на вычитывание вектора и т.д. - внутренние операции. Итого 17. Теперь с другой стороны. За 166мкс*20МГц=3320 тактов надо выполнить 256 прерываний. На прерывание 12.97 тактов. Меньше 17. Значит свободного времени у процессора нет совсем. И есть недобор. Почти в 1.5 раза. Непонятно, где-же время на генерацию колбаски? Надо бы рыбку уменьшить
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Oct 12 2007, 12:53
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(=GM= @ Oct 12 2007, 02:01)  Как видишь, можно обойтись без всяких сохранений контекстов(:-).
Для твоего случая, для 12 каналов, время прерывания можно сделать порядка 10 МЦ, т.е. с клоком 20 мег время одной ступеньки будет равно 0.5 мкс, период шим = 256*0.5=128 мкс, следовательно частота шим - 7.8 кГц, это на чистом ассемблере, а у тебя 5 кГц на си, неужто компилятор генерит такой быстрый код? Наверное я объяснил не очень, но всё же перечитайте мой пост. Там я пишу что первый способ требует сохранения контекста и вычислений. И там же написал, что при выводе 256 прерываний за период шима (ваш способ который я отнёс к третьему) прерывание короче и частота ШИМ выше. То что Вы описали для меня вполне укладывается в голову и я такие подходы тоже реализовывал. Цитата Непонятно одно. Если 3200 ступеней, то как получить шим 5 кГц? У тебя время одной ступени будет 200 мкс/3200=62.5 нс, а это примерно один МЦ контроллера. А мне непонятно, что именно непонятно Вам. Частота у меня 16000. 16000/3200 = 5кГц. Для двигателей я использую 2 канала на двигатель. Дробление делаю на 16. Сдвиг фаз 90 градусов. То есть мне фактически надо формировать несколько значений. Вот я и написал в первом своём посте, что плавность не нужна а точность 3200. Вы уточнили про точность. Но принципиально, тем не менее, так тоже можно работать. За период ШИМ необязательно делать вывод 256 раз (при 256 ступеньках) Достаточно 1 раз на один канал +1. В этом случае тоже создаётся соответствующая колбаса, только она короче. А также учитываются случаи совпадений. Ошибки будут при малых значения разницы таймера. Цитата(add @ Oct 12 2007, 15:35)   дауж.. т.е. если у Вас GM ("частота обновления портов соответственно будет равна 1/0.9=1.1 МГц" выражаясь моими терминами  ) то это совершенно не означает что вы можете менять данные с такой скоростью(переписывать регистры новыми значениями) у вас просто не останется времени на это и плюс еще "колбаска". По честному должна быть возможность менять данные (для 256 значений) один раз через 256 прерываний. так? а сколько у вас остается "свободных"тактов (суммарных от 256-ти прерываний)? По 20МЦ-13МЦ=7МЦ (это наверное с учетом 7 циклов на вход/выход в прерывание) 7*256=1792МЦ... хм.. может быть...?!  Вы, кстати, зря смеётесь. Те характеристики, что указывает GM я берусь реализовать и времени на расчёт останется вагон. Могу продемонстрировать. Лишь бы прерывание укладывалось в ступеньку. Время - я конечно заношу так как указывает defunct, хотя это и не обязательно. П/п линейная и ошибку можно высчитать и учесть при расчётах.
|
|
|
|
|
Oct 12 2007, 13:01
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата Но принципиально, тем не менее, так тоже можно работать. За период ШИМ необязательно делать вывод 256 раз (при 256 ступеньках) Достаточно 1 раз на один канал +1. В этом случае тоже создаётся соответствующая колбаса, только она короче. А также учитываются случаи совпадений. Ошибки будут при малых значения разницы таймера. Конечно, алгоритм генерации будет хитрый. Но в худшем случае будет всего N прерываний, где N - количество шимов. А чтобы не было ошибок, надо чтобы частота шима была меньше чем Fcpu/(Ni*256), где Ni - количество тактов на обработку прерывания.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Oct 12 2007, 13:29
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(Rst7 @ Oct 12 2007, 16:01)  Конечно, алгоритм генерации будет хитрый. Но в худшем случае будет всего N прерываний, где N - количество шимов. А чтобы не было ошибок, надо чтобы частота шима была меньше чем Fcpu/(Ni*256), где Ni - количество тактов на обработку прерывания. Совершенно в дырочку. Правда прерывание будет чуть чуть длиннее чем у GM. Кроме того, нет никаких проблем с реализацией такого алгоритма на Си. По крайней мере под IARом. Прерывание пишется на АСМе, а всё остальное на Си. Чуть-чуть доуточню. Прерываний N+1, где N- число шимов. А частота, будет чуть выше, чем ожидает RST, при правильном написании. Потому, что можно разрешить прерывание ранее чем произойдёт выход из прерывания. Надо внимательно анализировать. В общем случае вложенность не имеет принципиального значения, так как общая занятость процессора в прерываниях будет значительно меньше периода ШИМ. А длительность прерывания определяет только минимальный размер ступеньки.
|
|
|
|
|
Oct 12 2007, 14:21
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(Rst7 @ Oct 12 2007, 10:45)  Чето я не понял. Пусть будет 13 тактов. И еще надо добавить 4 - на вычитывание вектора и т.д. - внутренние операции. Итого 17. Теперь с другой стороны. За 166мкс*20МГц=3320 тактов надо выполнить 256 прерываний. На прерывание 12.97 тактов. Меньше 17. Значит свободного времени у процессора нет совсем. И есть недобор. Почти в 1.5 раза. Непонятно, где-же время на генерацию колбаски? Надо бы рыбку уменьшить  Ну так, прерываний-то всего 24 (по совпадению) + 1 (по переполнению таймера). За период 166 мкс (период шим) потратится в лучшем случае 25*0.05*17=21.25 мкс. Остальное время 166-22=144 мкс, вагон и маленькая тележка времени, 86% всего времени процессора, между прочим, можно пустить на расчёт "колбаски" по вашей терминологии. Цитата(add @ Oct 12 2007, 10:35)  Ну в Вашем случае вы подготавливаете "колбаску" вне прерывания.. adnega делает это внутри прерывания.. Есть ли в Вашем способе (скажу что способ вообщем то один и тотже) смысл выносить подготовку "колбаски за прерывание"?В таком случае для экономии времени в прерывании прийдется работать с флагами (события по окончанию обновления "колбаски").. и возможен пропуск момента смены значений? в чем выигрыш? может полагаясь на то что данные выводимые в шим обновляются не так часто? тогда какой смысл так "задирать"частоту"шима? Способ не один и тот же. Уже ответил, повторюсь. У меня всего максимум 24+1 прерывание на период шима, и только одно прерывание может возникнуть в течение одного кванта. На периоде шима умещается 256 квантов. Хотите увеличить частоту шима, не меняя количество квантов (или "ступеней" по-простому), уменьшайте длительность кванта. Смена значений происходит во время прерывания от таймера (квант 255). Скажу больше, пока прерывания работают с одной "колбаской" в течение текущего периода шима, фоновая программа готовит другую "колбаску" для следующего периода шима, так они поочерёдно и меняются, всё по-честному. Подчеркну ещё раз, при данном подходе есть принципиальная возможность менять уставки ВСЕХ шимов для КАЖДОГО периода шим. Другой вопрос (и не такой простой), откуда возьмутся новые 48 байт уставок (2 байта на один канал) за период шима (166 мкс).
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 12 2007, 14:28
|

Местный
  
Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459

|
Цитата(SasaVitebsk @ Oct 12 2007, 16:53)  Вы, кстати, зря смеётесь. Те характеристики, что указывает GM я берусь реализовать и времени на расчёт останется вагон. Могу продемонстрировать.... Если Вас не затруднит, пожалуйста продемонстрируйте. (не обязательно кодом), можно и даже наверное лучше алгоритмом. А главное хотелось бы увидеть количество МЦ отводимых на каждый шаг. зы: исх. данные вроде были такие: Такт-20МГц , прерывания 1.5МГц, Шим 6КГц 256 шагов. Ну еще в довесок 24 канала. Жду с нетерпением(это не сарказм). :-)
--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
|
|
|
|
|
Oct 12 2007, 16:15
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(defunct @ Oct 12 2007, 14:29)  В таком случае почему вы меняете TCR0, а не OCR0? И почему не модифицируется X? 24 * 4 = 90 байт, на авто переполнение расчитывать здесь не получится Здесь описка, конечно OCR0, вроде регистра TCR0 нет в авроровской природе. В течение периода шим возникает до 24 прерываний по совпадению, В конце периода шим возникает последнее прерывание, по переполнению, там происходит обнуление портов и с помощью команды lds xl,pwmtable заносится адрес другого буфера. И всё по-новой! И вновь продолжается бой!(:-) Да вот фрагмент, собственно Код ;Процедура обработки прерывания таймер0 по переполнению (15МЦ) eopwm: ldi temp,0 ;обнуление out porta,temp ;порта 1 out portb,temp ;порта 2 out portc,temp ;порта 3 mov r3,temp ;начало шим lds XL,pwmtable ;адрес текущего буфера уставок ld temp,X+ ;первая уставка out OCR0,temp ;нового периода шим reti ;сделано Первый раз я выложил функцию просто для демонстрации SasaVitebsk, как я организовывал шим. ни в одну из описанных им схем я не вошёл. Да собственно, так, как показано, я не делаю, слишком медленно(:-). Теперь, надеюсь, на все ваши нынешние и предыдущие вопросы ответил? Цитата(defunct @ Oct 12 2007, 07:59)  1. теряем ценный регистр X. 2. не понятно где осуществляется сброс X в начальное состояние. 3. почему ОCR0 меняется самым последним? 4. Зачем он вообще меняется (25-й канал)?
Функция по тактам возможно и оптимальна, но с т. з. функциональности то, что вы привели - это разрозненные колбасные обрезки Функция по тактам практически оптимальна, с учетом выбранного алгоритма. И с точки зрения функциональности тут всё нормально, повторюсь, она была выложена просто для демонстрации одной из реализаций шим, ничего более, не как законченная программа, которую взял, прошил и пользуйся. Насчёт ценного регистра. А куда их девать, солить что ли(:-)?
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 12 2007, 21:04
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(=GM= @ Oct 12 2007, 19:15)  Функция по тактам практически оптимальна, с учетом выбранного алгоритма. И с точки зрения функциональности тут всё нормально, повторюсь, она была выложена просто для демонстрации одной из реализаций шим, ничего более, не как законченная программа, которую взял, прошил и пользуйся. Согласен, красивый способ как для чисто вывода многоканалного ШИМа, остается вопрос смены данных? Получается нетривиальная задача сформировать (фактически упаковать) 24 канала. При изменении значения любого одного канала весь массив придется перестроить. С какой частотой дискретизации у вас обновляется массив?
|
|
|
|
|
Oct 12 2007, 21:54
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(defunct @ Oct 12 2007, 21:04)  Согласен, красивый способ как для чисто вывода многоканалного ШИМа, остается вопрос смены данных? Получается нетривиальная задача сформировать (фактически упаковать) 24 канала. При изменении значения любого одного канала весь массив придется перестроить. С какой частотой дискретизации у вас обновляется массив? Не совсем уверен, что такое "частота дискретизации" обновления массива(:-). В течение каждого периода шим, т.е. за 166 мкс (поскольку частота шим 6 кГц), формируется упорядоченная таблица для вывода с помощью приведённой выше программы обработки прерываний по совпадению. Задача была непростая в реализации, поскольку я никогда не занимался сортировкой. Пришлось освоить, был выбран модифицированный пузырьковый метод. Программа даже в неоптимальном виде полностью выполняется в течение периода шим. Далее адрес начала упорядоченной таблицы записывается в ячейку памяти, откуда её берёт программа обработки прерываний по переполнению и засылает в тот самый пресловутый регистр Х, который по-вашему очень "ценный". Вроде всё.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 12 2007, 22:08
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(=GM= @ Oct 13 2007, 00:54)  Не совсем уверен, что такое "частота дискретизации" обновления массива(:-). имел в виду частоту с которой можно менять значения каналов. т.к. мне почему-то показалась, что она будет ниже частоты ШИМ. Цитата В течение каждого периода шим, т.е. за 166 мкс (поскольку частота шим 6 кГц), формируется упорядоченная таблица для вывода с помощью приведённой выше программы обработки прерываний по совпадению. хм.. и 166us хватает на сортировку "пузырьком"?
|
|
|
|
|
Oct 12 2007, 23:56
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(defunct @ Oct 12 2007, 22:08)  имел в виду частоту с которой можно менять значения каналов. т.к. мне почему-то показалась, что она будет ниже частоты ШИМ. хм.. и 166us хватает на сортировку "пузырьком"? Ну да, а что тут такого? Щас вот посмотрел метод сортировка-слияние, сортируется 12 и еще 12, потом списки сливаются, так на сортировку 12 уставок уходит 618 МЦ. Ну еще на создание текущих записей 664 МЦ. На круг получается где-то 2200 Мц, т.е. 110 мкс. И всё. Что касается частоты смены значений каналов, то на практике требуется одна смена на 10+ периодов шим, редко меньше.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 13 2007, 10:02
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(=GM= @ Oct 12 2007, 19:15)  Первый раз я выложил функцию просто для демонстрации SasaVitebsk, как я организовывал шим. ни в одну из описанных им схем я не вошёл. Да собственно, так, как показано, я не делаю, слишком медленно(:-). Теперь, надеюсь, на все ваши нынешние и предыдущие вопросы ответил? В смысле не вошёл - это первый из описанных мной способов. Именно так я реализовывал ШИМ в 89 году. Только регистра OCR в 48 не было, но это тоже не проблема. Алгоритм прост. Создаётся структура связанная. Значения портов(порта) и следующее время переключения. Для каждого из прерываний. Одна структура действующая, вторая в это время подготавливается. Так же как это делается при работе с изображением. При подготовке структуры сначала формируются структура, потом переупорядываются значения по возрастанию значений таймера, потом вычитаются значения из предыдущего интегрального. В смысле высчитывается сколько времени должно пройти от предыдущего прерывания OCR. Здесь же учитывается ошибка выставления времени (для проги приведённой GM у меня и defunct её не будет) и учитывается возможность совпадения двух прерываний(об чём я писал выше). В этом случае одно значение убирается а портам делается OR ну или AND в зависимости от полярности ШИМа. По переполнению меняется структура и взводятся все порты. Если OCR регистра нет, то всё делается на OCF, правда программа прерывания получается чуть больше потому, что контролируется ещё и колличество прерываний (расчитывается где формировать начало ШИМ). Принципиально таким способом можно выводить более высокую частоту ШИМа чем расчитанная Rst7. Замечу правильно расчитанная. Ну например вдвое выше. Правда при этом будет искажаться значения бизкие к 1. То есть если величина ШИМ для каналов 1 и 2 отличается на 1, то при выводе значение для канала 2 будет искажено на 1 (то есть они будут отличаться на двойку это зацепит и последующие каналы), но существуют задачи, где это не принципиально или где такая ситуация невозможна (как у меня в варианте с ШД). Именно об это я и спрашивал GM, но он не понял. Существуют модификации такого алгоритма. Если число каналов не так высоко или они взаимно связаны, то можно убрать расчёты а использовать несколько OCR регистров. В том числе на разных таймерах.
|
|
|
|
|
Oct 13 2007, 11:26
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
После размышлений, я пришел к выводу, что самый быстрый вывод без ошибок для каналов с разностью 1 будет выглядеть так Код ; Это исключительно сохранение контекста (для использования с компилятором) MOVW R13:R12, R31:R30 MOVW R31:R30, R11:R10
REPT 24 LD R15, Z+ OUT PORT1, R15 LD R15, Z+ OUT PORT2, R15 LD R15, Z+ OUT PORT3, R15 LD R15, Z+ SBRS R15,7 RJMP ENDPWM ENDM
ENDPWM OUT OCRx,R15
; Это исключительно восстановление контекста (для использования с компилятором) MOVW R11:R10, R31:R30 MOVW R31:R30, R13:R12 RETI Таймер устанавливается с максимумом 128 (должно быть два OCR в таймере), и старший бит в новом значении для таймера говорит, склеивать ли прерывания в одно. Только чуть-чуть ширина может меняться, но ее тоже можно скомпенсировать. Вот в таком варианте ровно 13 тактов, значит макс. частота будет 6.01 кГц (при тактовой 20МГц). А, и еще должен быть костылек для длительности больше 128 между переключениями. ЗЫ: а если 23 шима, то заметно быстрее можно. Однако, с жертвой одного бита порта.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Oct 13 2007, 13:48
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(Rst7 @ Oct 13 2007, 11:26)  После размышлений, я пришел к выводу, что самый быстрый вывод без ошибок для каналов с разностью 1 будет выглядеть ... Таймер устанавливается с максимумом 128 (должно быть два OCR в таймере), и старший бит в новом значении для таймера говорит, склеивать ли прерывания в одно. В принципе я так и делаю в своей программе. В вашем варианте вы забыли про чтение из буфера и запись в OCR0 следующей уставки. Кроме того, вы уже пожертвовали старшим битом порта 3, так что у вас будет уже 23 канала, лучше всё же 24, чтобы три порта были использованы под завязку.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 13 2007, 13:54
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата(=GM= @ Oct 13 2007, 16:48)  В принципе я так и делаю в своей программе. В вашем варианте вы забыли про чтение из буфера и запись в OCR0 следующей уставки. Ничего я не забыл. Я сразу обрабатываю следующее значение порта, не выходя из обработчика. REPT 24 изготавливает 24 повторяющихся куска, на самый плохой случай, если все уставки отличаются на 1 и из прерывания не нужно выходить. Цитата Кроме того, вы уже пожертвовали старшим битом порта 3, так что у вас будет уже 23 канала, лучше всё же 24, чтобы три порта были использованы под завязку. Пожертвовал я старшим битом уставки таймера. Так что шимов - 24
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Oct 13 2007, 19:28
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(Rst7 @ Oct 13 2007, 11:26)  Таймер устанавливается с максимумом 128 (должно быть два OCR в таймере), и старший бит в новом значении для таймера говорит, склеивать ли прерывания в одно. Только чуть-чуть ширина может меняться, но ее тоже можно скомпенсировать. Добавлю, таймером можно и не жертвовать. Есть два пути решения проблемы, первый - экстенсивный: переключение всего прерывания на обработку уставок до 0х7F и после 0х80, и второй - интенсивный(:-) - вместо уставки поставить флаг сцепленности двух прерываний, а саму уставку читать позднее (там возникнет ещё одна проблемка, тоже решаемая...), не буду сильно грузить, подумайте, может быть коллективный разум придумает третий, наиболее приемлемый путь.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 15 2007, 13:49
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(add @ Oct 15 2007, 09:23)  Ув. =GM=, перечитал все посты не один раз, но так и непонял сути Вашего алгоритма. Как я понял Вы заранее подготавливаете данные для вывода в порт а также константу сравнения для таймера. Но если у вас для всех 24-х каналов устанавливается длительность одновременно, как меняется значение в каждом канале? Или у Вас задан массив в котором значение для одного канала задается не в одном байте а в х-отом бите каждого байта, а текущая длительность интервала импульса шима по прерыванию либо добавляется, либо нет к интегралу всего периода? Поправьте пожалуйста, если что-то не так понял. Какое максимальное кол-во значений ступенек можно в таком случае реализовать? И на сколько МЦ затратно подготовка данных для такого шима? Ну, если по-честному, то я здесь свой алгоритм и не выставлял, немудрено его не понять. Был выложен фрагмент Саше Витебскому просто для иллюстрации, как я реализовывал свой алгоритм, ничего более. Но потом народ стал спрашивать подробности, я стал отвечать, теперь вроде бы должен нести ответ(:-) Итак, приступим к выявлению момента истины...Несколько аксиом для разгона. 1) Будем использовать МК с ОЗУ не менее 1 Кбайта и тактовой частотой 20 МГц, ну и ног должно хватить по крайней мере для 24 выходных шимов. Пусть это будет атмега88. 2) Формирование выходных сигналов 24-канальной шим осуществляется в прерывании таймера0 по сравнению в Output Compare Unit (подробнее см. в doc8025а, с.98). Программа выдачи приведена в моём посте #18. Время выполнения 18 машинных циклов (можно снизить до 13). 3) За период шима может возникнуть максимум 24 прерывания (по числу сигналов шим). 4) Полное время на все прерывания не более 18*24*0.05=21.6 мкс. Как это всё работает. В начале периода шим обнуляются все 24 шим сигнала и таймер начинает работать с 0. В регистр сравнения OCR0A из текущего буфера запихивается первая уставка, т.е. таймерное время, когда некоему шиму (или нескольким, не важно) необходимо перейти из состояния 0 в состояние 1. При достижении равенства уставки и значения в таймере происходит прерывание OCF0A, начинает работать программа из поста #18, которая выставляет в порты сформированные заранее образы всех ТРЁХ портов. Затем программа записывает в OCR0A вторую уставку и засыпает до следующего прерывания. В это время фоновая программа подготавливает следующий буфер для следующего периода шим. Буфер состоит из 24 записей. Каждая запись содержит 4 байта. Общий вид таблицы таков Код уставка образ п.А образ п.B образ п.C .db 0x10, 0b0000000, 0b0000000, 0b00000011 .db 0x20, 0b0000000, 0b0000000, 0b00000111 .db 0x21, 0b0000000, 0b0000000, 0b00001111 .db 0x50, 0b0000000, 0b0000000, 0b00011111 . . . . . . . . . . . . . . . . . . . . . . . . . . . .db 0x8F, 0b1011111, 0b1111011, 0b00011111 .db 0xB9, 0b1111111, 0b1111111, 0b11111111 Как можно видеть, бит образа порта, перешедший из состояния 0 в состояние 1 в N-ой записи, остаётся в этом состоянии до конца таблицы. Основными задачами фоновой программы (с точки зрения формирования шим) являются приём извне (или вычисление) новых уставок для каждого канала и подготовка на их основе нового буфера. По окончанию подготовки нового буфера адрес нового буфера записывается в ячейку памяти. При нулевом времени таймера этот адрес записывается в регистр Х, как я уже говорил ранее. Далее фоновая программа принимает новые уставки и ждёт начала нового периода шим для подготовки нового буфера. Ну вот, вгрубе и всё описание. В завершение, ответы на ваши вопросы. Максимальное количество ступенек – 256, за один период шима (для 6 кГц) фоновая программа успевает учесть в подготовке все 24 уставки (подчеркну, если они будут готовы), об этом тоже писалось ранее. Например, в одном периоде можно установить все сигналы в 1, а в следующем – в 0. На выходе всех каналов будет меандр с Fшим/2. Как видите, можно легко и непринуждённо достичь частоты Найквиста(:-).
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 15 2007, 20:13
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(=GM= @ Oct 12 2007, 03:01)  Вот моя базовая процедура, выполняется за 18 МЦ Код ;Процедура формирования 256-точечного 24-канального ШИМа (18МЦ) pwmisr: ld temp,x+ ;обновление out port1,temp;порта 1 ld temp,x+ ;обновление out port2,temp;порта 2 ld temp,x+ ;обновление out port3,temp;порта 3 ld temp,x+ ;новая уставка out TCR0,temp ;для сравнения reti =GM=, лихо у Вас такты подсчитаны, я так не умею Вот мой расчет для худшего случая: 3(джиттер при попадании прерывания на 4 тактовую команду) + 4(вход в прерывание) + 4*2(LD) + 4*1(OUT) + 4(RETI) + 4(максимальное количество тактов до начала следующего прерывания) = 27 тактов однако...
|
|
|
|
|
Oct 15 2007, 20:23
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Кстати сам СИ скомпилит не очень плохо. У меня сейчас правда несколько отличная задача. В смысле ШИМ то построен также но список состояний строго ограничен. В связи с этим я всё делаю прямо в прерываниях. То есть управление двигателями размазываю по всем прерываниям. Включая разгон/торможение/управление скоростью/ подход к заданному значению. Поэтому п/п у меня несколько раздуты. Ну и конкест соответственно великоват. Но сам вывод портов - вполне адекватен. Код 69 // Вывод предварительно расчитанных значений портов 70 PORTE = bOport[1].E; \ 0000002C .... LDI R26, LOW(bOport) \ 0000002E .... LDI R27, (bOport) >> 8 \ 00000030 01FD MOVW R31:R30, R27:R26 \ 00000032 8103 LDD R16, Z+3 \ 00000034 B90E OUT 0x0E, R16 71 PORTA = bOport[1].A; \ 00000036 8104 LDD R16, Z+4 \ 00000038 B902 OUT 0x02, R16 72 PORTC = bOport[1].C; \ 0000003A 8105 LDD R16, Z+5 \ 0000003C B908 OUT 0x08, R16
|
|
|
|
|
Oct 15 2007, 22:19
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(singlskv @ Oct 15 2007, 20:13)  3(джиттер при попадании прерывания на 4 тактовую команду) + 4(вход в прерывание) +4*2(LD) + 4*1(OUT) + 4(RETI) + 4(максимальное количество тактов до начала следующего прерывания) = 27 тактов однако... Ну, во-первых, у меня одно и двухтактные команды в фоне, четырёхтактных нет вообще, во-вторых, джиттер считать не надо, поскольку на следующем прерывании будет такой же случайный джиттер. Матожидание там равно нуло, стало быть вклад джиттера будет нулевым. В первом приближении вы правы, общее количество тактов = 4(сохранение программного счётчика в стеке) + 2(прыжок из вектора прерывания, это вы забыли, но можно опустить) + 12(тело программы) + 4(reti) + 1/2(выполнение одной команды) = 24 такта максимум. Я эту программу привёл просто как иллюстрацию Саше Витебскому, я такую не использую. С ходу могу её улучшить тактов на 5, поставив sei перед последней командой out, а вот почему так, подумайте на досуге, неплохая шарада перед сном(:-). В принципе, Rst7 (мой респект!) привёл фрагмент, практически один в один совпадающий с одной из моих ранних штатных программ, там допускается 13 тактов между двумя последовательными обновлениями портов. Раз разговор зашёл о количестве тактов и о максимальных частотах, сообщаю вам, на сегодняшний день я довёл частоту шим до 11 кГц, и пока на этом успокоился(:-).
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 15 2007, 23:29
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Я думаю некоторым это пригодится. Когда-то на заре появления МК тоже любил побаловаться "вылизыванием до такта". Теперь считаю это не перспективным. Это я безусловно, не в пику вам говорю. Это так размышления у парадного подъезда электроники. Всё это уже многократно обсуждалось, но если подытожить то выглядит так: 1) Производительность процов продолжает расти семимильными шагами. Появились доступные DSP процы и многоядерные процы. 2) Стоимость кремния и процов снизились до стоимости мусора. Так где-то в 90 году стоимость однокристалки 8751 доходила до 350 рублей (читай $). Сейчас как известно стоимость опустилась до 1$ при более чем 20 кратном росте производительности. 3) Реальная стоимость $ в 90 году была несопоставима с его нынешней стоимостью. 4) Стоимость памяти упала ещё более значительно. В 93 году стоимость 1мб ОЗУ ~ 30$ ============== Подытоживая - Вы можете использовать очень мощные камни и при этом очень длинные проги писать и массу озу использовать и при этом конечная стоимость изделия вполне будет по карману рядовому покупателю. С другой стороны запросы растут. Требуются всё более умные вещи. Потребность в программах и программистах - растёт (В том числе и за счёт перекладывания большого числа ф-ий которые раньше делались аппаратно). Время написания проекта и его изготовления - катастрофически уменьшается. Всё меньше людей хотят купить проект - всё большее готовое рабочее изделие. Поэтому, на мой взгляд роль языков высокого уровня будет расти. Колличество программных инструментов - тоже. Применение ОС будет если не повсеместным, то распространённым явлением. Программы будут писаться наотмашь. То есть примерно такой подход, который развивается на компах. Где даже я сейчас конфигурационные файлы в текстовом виде делаю. А реестр винды будет занимать не один десяток мегов.  Ну а из приятных моментов - применение красивых и интересных алгоритмов приветствуется на любом языке. То есть полученные знания всегда с вами и никуда не денутся.
|
|
|
|
|
Oct 16 2007, 04:01
|

Местный
  
Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459

|
SasaVitebsk, Вы так все хорошо подытожили.. прям даже не хотелось больше вопросов задавать :-) Цитата(=GM= @ Oct 15 2007, 17:49)  Ну, если по-честному, то я здесь свой алгоритм и не выставлял, немудрено его не понять. .. Значит мое предположение посте №48 оказалось верным. :-) Еще один мАААлюсенький вопросик, ну для полного блаженства :-).. Вот например если мы работаем с массивом постоянно меняющихся значений шима (.db 23,45,255,10 ....и т.п.) , то в озу необходимо подготавливать данные, а как? Ролами(rol)?, рорами(ror)? Как лучше перелопатить массив необходимую форму?
--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
|
|
|
|
|
Oct 16 2007, 10:15
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(add @ Oct 16 2007, 03:01)  Значит мое предположение посте №48 оказалось верным. :-) Еще один мАААлюсенький вопросик, ну для полного блаженства :-).. Вот например если мы работаем с массивом постоянно меняющихся значений шима (.db 23,45,255,10 ....и т.п.) , то в озу необходимо подготавливать данные, а как? Ролами(rol)?, рорами(ror)? Как лучше перелопатить массив в необходимую форму? Ну я рад, что оно оказалось верным, только какое?(:-). Для подготовки данных я беру раттерны для каждого канала, они лежат в пзу, вид у них такой Код pattern: .db 0x01,0x00,0x00,0xFF ;образец для канала 1 .db 0x02,0x00,0x00,0xFF ;образец для канала 2 .db 0x04,0x00,0x00,0xFF ;образец для канала 3 и обычное OR три раза. Как-то так. Вообще, табличные методы сильно убыстряют процесс. Надо только найти подходящее табличное представление.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 16 2007, 11:27
|

Местный
  
Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459

|
Цитата(=GM= @ Oct 16 2007, 14:15)  Код pattern: .db 0x01,0x00,0x00,0xFF ;образец для канала 1 .db 0x02,0x00,0x00,0xFF ;образец для канала 2 .db 0x04,0x00,0x00,0xFF ;образец для канала 3 и обычное OR три раза. Как-то так. Вообще, табличные методы сильно убыстряют процесс. Надо только найти подходящее табличное представление.  все, Вы меня добили!  окончательно запутался. (видимо надо снова в школу идти) Попробую задать вопрос: Вот к примеру у нас массив (значения шима n-го канала): .db 11,255,20,188 и т. п. (это один канал!) ; каждое значение мы должны устанавливать через определенное время(ну например через секунду). для этого мы подготавливаем таблицу следующим образом: Код уставка образ п.А образ п.B образ п.C 1-канал..............................24канал .db 0x10, 0b0000000, 0b0000000, 0b00000011 7бит n-го канала .db 0x20, 0b0000000, 0b0000000, 0b00000111 6бит n-го канала .db 0x21, 0b0000000, 0b0000000, 0b00001111 5бит n-го канала .db 0x50, 0b0000000, 0b0000000, 0b00011111 4бит n-го канала
... так или нет? а если значения изменяется(приходит) из вне, нам надо преобразовать таблицу налету?
--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
|
|
|
|
|
Oct 16 2007, 12:29
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(add @ Oct 16 2007, 10:27)  Вот к примеру у нас массив (значения шима n-го канала): .db 11,255,20,188 и т. п. (это один канал!) ; каждое значение мы должны устанавливать через определенное время(ну например через секунду) Нет, это не один канал, а все каналы. В этой строчке находятся образы всех портов на эн-ном прерывании. Например 255 равно 11111111 в двоичке, значит портА весь будет в единицах. Буфер, вид которого показан в посте #49, используется программой, показанной в посте #18, что ж тут непонятного. Таких буферов два, на каждом периоде шима один буфер используется этой программой, второй буфер готовится фоновой программой. Потенциально можно подготовить один буфер за период шима, да больше и не надо. Но можете готовить его и секунду (в фоне), если того допускают условия вашей задачи. Под готовить я понимаю не только формирование буфера, но и расчёт (или получение извне) уставок для него. Цитата(add @ Oct 16 2007, 10:27)  а если значения изменяется(приходит) извне, нам надо преобразовать таблицу налету? Ну сказал уже, таблица готовится за один период шима. На лету это или нет? Зависит от угла зрения. Но быстрее просто не надо, незачем. Теперь стоит вопрос, как подготовить данную таблицу. Вот вы имеете все уставки, таблица из 24 записей (48 байт), первый байт - уставка, второй байт - номер канала. Таблица может быть неотсортирована, если отсортирована, то жизнь сильно упрощается. Предположим, вы её отсортировали, т.е. все времена идут строго в возрастающем, точнее, неубывающем порядке. Вопрос вам, как получить рабочую таблицу, вид которой показан в посте #49? Мой алгоритм таков. Берете первую запись, ставите туда первое время из таблицы уставок, теперь надо вставить 3 байта образа порта, по номеру канала находите в таблице паттернов нужные 3 байта и вставляете их в первую запись. Переходите ко второй записи. Перво-наперво сравниваете время второй уставки с временем из первой записи. Если они совпадают, то новую запись не создаете, а опять по номеру канала находите в таблице паттернов нужные 3 байта и делаете ИЛИ этих байтов с байтами из первой записи, и оставляете их в первой записи. Если они НЕ совпадают, делаете то же самое, но сохраняете в новой записи. И так делаете 24 раза. Долго было рассказывать, но МК тратит всего 644 МЦ. На сортировку уходит гораздо больше.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 16 2007, 16:01
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(Rst7 @ Oct 16 2007, 10:12)  Давайте, покажите код, удивите нас  Навеяло Больной: - Доктор, я буду жить? Доктор: - А смысл? Ну а если серьёзно, то я не готов ещё...Да и код сырой, не опробован в железе... Могу поделиться идеей, как выйти на 19 кГц программный шим, поскольку у меня не хватает времени на всё, вокруг столько интересного...Достаточно дикая идея кстати, но может стрельнуть!
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 16 2007, 17:22
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(=GM= @ Oct 16 2007, 02:19)  Ну, во-первых, у меня одно и двухтактные команды в фоне, четырёхтактных нет вообще, во-вторых, джиттер считать не надо, поскольку на следующем прерывании будет такой же случайный джиттер. Матожидание там равно нуло, стало быть вклад джиттера будет нулевым. В среднем Вы правы, почти, в частностях нужно разбираться отдельно... джиттер нужно считать обязательно, потому что в данном случае он всегда будет в +, нуль Вы никогда не получите. Тока максимум двухтактовые команды в фоне ? О С в фоне уже речь не идет, да и на асм сильно себя ограничиваем ? Цитата В первом приближении вы правы, общее количество тактов = 4(сохранение программного счётчика в стеке) + 2(прыжок из вектора прерывания, это вы забыли, но можно опустить) + 12(тело программы) + 4(reti) + 1/2(выполнение одной команды) = 24 такта максимум. + 2(прыжок ....) конечно не забыл, просто изначально посчитал что с этим прыжком будет все совсем плохо и решил что прерывание прописано в области векторов. Цитата Я эту программу привёл просто как иллюстрацию Саше Витебскому, я такую не использую. С ходу могу её улучшить тактов на 5, поставив sei перед последней командой out, а вот почему так, подумайте на досуге, неплохая шарада перед сном(:-). Спасибо конечно за шараду, тока для меня все изначально понятно, и очень неочевидно что такой вариант даст правильный/предсказуемый вариант в ситуации возможности смены всех значений ШИМ за период ШИМ. Нарисуйте код и я покажу где будут проблемы. Цитата В принципе, Rst7 (мой респект!) привёл фрагмент, практически один в один совпадающий с одной из моих ранних штатных программ, там допускается 13 тактов между двумя последовательными обновлениями портов. Допускается, но может быть и на ~80% хуже ? (то есть дребезг будет порядка 9 тактов) Цитата Раз разговор зашёл о количестве тактов и о максимальных частотах, сообщаю вам, на сегодняшний день я довёл частоту шим до 11 кГц, и пока на этом успокоился(:-). Ну дык тогда приведите готовый код хотя бы на 6 КГц, как уже утративший свою актуальность  , и мы его обсудим... Цитата Могу поделиться идеей, как выйти на 19 кГц программный шим, поскольку у меня не хватает времени на всё, вокруг столько интересного...Достаточно дикая идея кстати, но может стрельнуть! У меня тоже есть масса идей, но как показала практика общения с Вами, Вы ну это... слегка любите преувеличить... (надеюсь примеры не нужно приводить ?) Ваш вариант ШИМ очень неплох, тока если Вы заявляете о том что Вы достигли частоты XX, давайте разговаривать предметно..., без кода это бессмысленно.
|
|
|
|
|
Oct 17 2007, 04:07
|

Местный
  
Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459

|
Цитата(=GM= @ Oct 16 2007, 16:29)  Нет, это не один канал, ... Теперь стоит вопрос, как подготовить данную таблицу. Вот вы имеете все уставки, таблица из 24 записей (48 байт), ну это я в примере просто привел массив, изменения значения на одном канале. Поясню вопрос: Вот,к ПРИМЕРУ значения для 1-го канала=245, для 2-го канала=36,для 3-го канала=48...и т.д. (цифры от балды). нет, в начале мы имеем 24байта, по байту на значение для каждого канала шима(24 канала). Как перевести эти значения в нужную таблицу? По сути наверное необходимо взять все первые биты в каждом байте поместить их в первую строчку, потом вторые биты и помечтить во вторую строчку и т.д. (ну добавить байт уставок ето понятно) . У нас получились образы для прерываний интервалы которых мы задаем уставками. так? Дык ведь подготовка этой таблицы займет тучу времени?! вот в этом и есть вопрос: как Вы ее подготавливаете? Прошу прощения, что то сразу недоходит и лыжи не едут:-( И еще вопрос: если у нас добавляем байт уставок в каждой строчке, это же трата памяти, причем заполнения по сути одинаковыми значениями с равным периодом?
--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
|
|
|
|
|
Oct 17 2007, 13:34
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(add @ Oct 17 2007, 03:07)  нет, в начале мы имеем 24байта, по байту на значение для каждого канала шима(24 канала). Как перевести эти значения в нужную таблицу? По сути наверное необходимо взять все первые биты в каждом байте поместить их в первую строчку, потом вторые биты и поместить во вторую строчку и т.д. (ну добавить байт уставок ето понятно) . У нас получились образы для прерываний интервалы которых мы задаем уставками. так? Дык ведь подготовка этой таблицы займет тучу времени?! вот в этом и есть вопрос: как Вы ее подготавливаете? Прошу прощения, что то сразу недоходит и лыжи не едут:-( И еще вопрос: если добавляем байт уставок в каждой строчке, это же трата памяти, причем заполнения по сути одинаковыми значениями с равным периодом? Внимательно прочтите посты #49 и #58. Во втором посте на словах описан мой алгоритм создания таблицы. Вы его поняли? Похоже, где-то у вас недопонимание. Вот скажите, вы саму идею уловили, как это всё работает? Если уловили, напишите сюда своими словами. И вам станет понятнее, и я пойму, почему у вас смазка с лыж испаряется(:-).
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 17 2007, 16:44
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(singlskv @ Oct 16 2007, 16:22)  В среднем Вы правы, почти, в частностях нужно разбираться отдельно... джиттер нужно считать обязательно, потому что в данном случае он всегда будет в +, нуль Вы никогда не получите. Тока максимум двухтактовые команды в фоне? О С в фоне уже речь не идет, да и на асм сильно себя ограничиваем ? Ага, давайте туда джаву и вижуал бейсик ещё присобачим, почему нет(:-)? Там бедная аврка еле-еле с трудом справляется на ассемблере на такой скорости, каждый такт на счету... Цитата(singlskv @ Oct 16 2007, 16:22)  + 2(прыжок ....) конечно не забыл, просто изначально посчитал что с этим прыжком будет все совсем плохо и решил что прерывание прописано в области векторов. Спасибо конечно за шараду, тока для меня все изначально понятно, и очень неочевидно что такой вариант даст правильный/предсказуемый вариант в ситуации возможности смены всех значений ШИМ за период ШИМ. Нарисуйте код и я покажу где будут проблемы Вы покажите, где проблемы с приведенным кодом будут, а дальше будем посмотреть. Кстати, время 18МЦ, которое указано в заголовке и есть время выполнения именно данной подпрограммы, с учётом скрытого прыжка из области векторов. Вот скажите, как по-вашему, с каким минимальным периодом можно вызывать данную подпрограмму? Цитата(singlskv @ Oct 16 2007, 16:22)  Допускается, но может быть и на ~80% хуже ? (то есть дребезг будет порядка 9 тактов) Ну-ка, ну-ка, интересно, расскажите по-подробнее. Цитата(singlskv @ Oct 16 2007, 16:22)  У меня тоже есть масса идей, но как показала практика общения с Вами, Вы ну это... слегка любите преувеличить... (надеюсь примеры не нужно приводить?) Ну почему, приведите. Заодно и вашу хоть какую-нибудь стоящую идею по 24-канальной шим, чтоб по теме ветки. Кстати уж, своими идеями я собирался поделиться не с вами, а с Rst7, приглашал его к сотрудничеству так сказать, надеюсь это не ваш коллега? Цитата(singlskv @ Oct 16 2007, 16:22)  Ну дык тогда приведите готовый код хотя бы на 6 КГц, как уже утративший свою актуальность  , и мы его обсудим...Ваш вариант ШИМ очень неплох, тока если Вы заявляете о том что Вы достигли частоты XX, давайте разговаривать предметно..., без кода это бессмысленно. И не заявлял я, просто сказал: к вашему сведению. Код пока актуален, но ваше желание получить код чувствуется, непонятно правда зачем, если всё так плохо в этом коде...
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 17 2007, 18:36
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(muravei @ Oct 17 2007, 18:09)  Все это здорово, но я никак не пойму - какой здесь практический смысл. Понятно, что это "затачивается" под светодиоды, но 8 полноцветных это "маловато будет". Вот если бы 72 канала на АВР  Легко! Ставим 3 аврки и у вас 72 канала по 6 кГц каждый(:-). Вот и смысл появился, не было бы оптимизации, пришлось бы ставить 10 авр для тех же 6 кГц. Кстати, а токи какие нужны? [Алексей, чисто информация: моно1 на форуме замутил тему по осциллам, подключайтесь]
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 17 2007, 19:40
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(muravei @ Oct 17 2007, 21:09)  Все это здорово, но я никак не пойму - какой здесь практический смысл. Понятно, что это "затачивается" под светодиоды, но 8 полноцветных это "маловато будет". Вот если бы 72 канала на АВР  Под светодиоды такое затачивать полный бред. Зачем? Разве что побаловаться. Нет, это затачивается под различные преобразователи. Что-то типа DAC, где точность не очень важна, где джиттер не имеет существенного значения, так как, как правило, значение меняется в среднем меньше чем раз за период. Типовое применение я уже описал. Управление ШД. Например фирмы switec который управляется непосредственно с ног AVR. Или управление скоростью двигателя постоянного тока, управление подсветкой LCD дисплея и т.п. В моём случае период ШИМ имеет принципиальное значение. Так как от частоты ШИМ, учитывая дробление, зависит максимальная частота вращения двигателя, а это в свою очередь сказывается на времени свала стрелок. Таким же способом, к примеру формируется синус, если надо. Ну и т.д. Зачем притягивать за уши. Такое применяется если Вам нужно. То что сам ШИМ применяется широко, видно хотябы из того, что практически все контроллеры сейчас его имеют на борту (аппаратный). Но аппаратный очень хорошо, но одна засада - их мало. Так я, к примеру управляю 6 двигателями по 2 канала ШИМ на каждый. С такими однокристалками - напряг. Кроме всего мне надо CAN на борту. И вот их нет вообще. Таким образом совтовый ШИМ - отличный выход из положения. Ошибки - не принципиальны, так как ошибка существует только в пределах микрошага.
|
|
|
|
|
Oct 17 2007, 19:46
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(=GM= @ Oct 17 2007, 20:44)  Ага, давайте туда джаву и вижуал бейсик ещё присобачим, почему нет(:-)? Там бедная аврка еле-еле с трудом справляется на ассемблере на такой скорости, каждый такт на счету... Давайте не будем перегибать палку ! Речь шла например о командах типа SBRx, SBIx которые потенциально 3 тактовые. Конечно в асемблере можно гарантировать что они будут максимум 2 тактовыми, но просто в обсуждении все время мелькал вариант при котором прерывание на асм а все остальное на С, так что вопрос был только об этом... Кстати Вы сами признавались что сортировка это не Ваш конек, так что могу предположить что этот кусок у некоторых на С будет лучше чем у Вас на асм. Если речь чисто о асм то нивапрос. Цитата Вы покажите, где проблемы с приведенным кодом будут, а дальше будем посмотреть. Кстати, время 18МЦ, которое указано в заголовке и есть время выполнения именно данной подпрограммы, с учётом скрытого прыжка из области векторов. Вот скажите, как по-вашему, с каким минимальным периодом можно вызывать данную подпрограмму? Я кода пока не увидел... То что Вы обозвали 18 тактов занимает больше и Вы с этим согласились в посте №52, как я могу указать Вам на проблемы если другого(правильного) кода нету ? Цитата Ну-ка, ну-ка, интересно, расскажите по-подробнее. За отсутсвием хотя бы какого-то законченного варианта кода я Вам врядли смогу точно ответить, я могу только предполагать. Отвечу вопросом на вопрос, Вы считали какие промежутки времени проходят при выводе в одноименные порты(джиттер) например при таких раскладах: - полочки PWM через одну - две полочки PWM подряд, пропуск 1 полочки, 2 полочки подряд - два вышеупомянутых варианта, по при этом половина полочек около 0 а вторая около 255 итд ??? Цитата Ну почему, приведите. Вам нужен Освежитель Памяти ? да пожалуйста, например ловля временных интервалов на мега128 с точностью 0,5 такта, ссылку искать нужно ? или уже сами вспомнили ? Цитата Заодно и вашу хоть какую-нибудь стоящую идею по 24-канальной шим, чтоб по теме ветки. Кстати уж, своими идеями я собирался поделиться не с вами, а с Rst7, приглашал его к сотрудничеству так сказать, надеюсь это не ваш коллега?
И не заявлял я, просто сказал: к вашему сведению. Код пока актуален, но ваше желание получить код чувствуется, непонятно правда зачем, если всё так плохо в этом коде... Нету у меня желания заполучить Ваш код, я могу и свой написать, асм чуть-чуть знаю  Считайте что это просто спортивный интерес.
|
|
|
|
|
Oct 17 2007, 21:05
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(singlskv @ Oct 17 2007, 19:46)  Кстати Вы сами признавались что сортировка это не Ваш конек, так что могу предположить что этот кусок у некоторых на С будет лучше чем у Вас на асм Ну покажите ваше исскусство на си, сравним(:-). Исходные данные такие: 24 записи по 2 байта каждая, первый байт - уставка, второй байт - канал, ассоциированный с данной уставкой. Надо упорядочить таблицу на месте, так чтобы уставки в записях были размещены в неубывающем порядке вместе с номерами каналов. Цитата(singlskv @ Oct 17 2007, 19:46)  То что Вы обозвали 18 тактов занимает больше и Вы с этим согласились в посте №52, как я могу указать Вам на проблемы, если другого(правильного) кода нету? За отсутствием хотя бы какого-то законченного варианта кода я Вам врядли смогу точно ответить, я могу только предполагать Приведен законченный вариант, не самый скоростной впрочем, средненький. Приведенная программа выполняется именно за 18 циклов, включая rjmp из векторной области. Какой, по вашему мнению, минимальный период вызова данной функции? Цитата(singlskv @ Oct 17 2007, 19:46)  Отвечу вопросом на вопрос, Вы считали какие промежутки времени проходят при выводе в одноименные порты(джиттер) например при таких раскладах: - полочки PWM через одну - две полочки PWM подряд, пропуск 1 полочки, 2 полочки подряд - два вышеупомянутых варианта, по при этом половина полочек около 0 а вторая около 255 итд ??? Если уставки не менялись, то джиттера вроде нет вообще. До конца не исследовал впрочем. Алгоритму по барабану положение "полочек". Они могут быть в любой позиции 1-255, кроме нулевой. Цитата(singlskv @ Oct 17 2007, 19:46)  Вам нужен Освежитель Памяти? да пожалуйста, например ловля временных интервалов на мега128 с точностью 0,5 такта, ссылку искать нужно? или уже сами вспомнили? Будете смеяться, но я решил-таки ту задачу, именно с точностью 0.5 такта. Что ещё?
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 17 2007, 21:35
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(=GM= @ Oct 18 2007, 01:05)  Ну покажите ваше исскусство на си, сравним(:-). Исходные данные такие: 24 записи по 2 байта каждая, первый байт - уставка, второй байт - канал, ассоциированный с данной уставкой. Надо упорядочить таблицу на месте, так чтобы уставки в записях были размещены в неубывающем порядке вместе с номерами каналов. Сравнивать начнем с момента показа Вашего кода Цитата Приведен законченный вариант, не самый скоростной впрочем, средненький. Приведенная программа выполняется именно за 18 циклов, включая rjmp из векторной области. Какой, по вашему мнению, минимальный период вызова данной функции? Где законченый вариант ? Где код который я могу загнать в AVRStudio и его там проверить ? Цитата Если уставки не менялись, то джиттера вроде нет вообще. До конца не исследовал впрочем. Алгоритму по барабану положение "полочек". Они могут быть в любой позиции 1-255, кроме нулевой. А Вы на всякий случай поиследуйте, может чего интересное и увидите, а почему 0 в опозициии, тактов не хватает ? дык тогда у Вас уже неполноценный шим. Цитата Будете смеяться, но я решил-таки ту задачу, именно с точностью 0.5 такта. Что ещё? Смеятся буду когда Вы приведете свое решение... P.S. И Вобще, у меня есть алгоритм шима на 100КГц при 256 полочках и никакого джиттера, тока я Вам его не покажу, потому как комерческая тайна, но зато мой алгоритм в 10 раз лучше Вашего... Кстати, вот тут еще один интересный вопросик образовался: Цитата(=GM= @ Oct 15 2007, 17:49)  1) Будем использовать МК с ОЗУ не менее 1 Кбайта и тактовой частотой 20 МГц, ну и ног должно хватить по крайней мере для 24 выходных шимов. Пусть это будет атмега88. Как Вы планировали запустить мегу88 на 20Мгц так чтобы 3 порта(24пина) остались свободными ?
|
|
|
|
|
Oct 18 2007, 09:50
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(singlskv @ Oct 17 2007, 20:35)  Сравнивать начнем с момента показа Вашего кода Цитата(singlskv @ Oct 17 2007, 20:35)  Где законченый вариант? Где код, который я могу загнать в AVRStudio и его там проверить ? Зачем вам мой код, вы ж говорили, что он вам не нужен, да и идей у вас много, напишите свой, под 100 кГц(:-) Цитата(singlskv @ Oct 17 2007, 20:35)  а почему 0 в опозициии, тактов не хватает ? дык тогда у Вас уже неполноценный шим Реализовать легко во всех позициях 0-255, но не уверен, можно ли назвать это шимом: период становится бесконечным(:-) Цитата(singlskv @ Oct 17 2007, 20:35)  Кстати, вот тут еще один интересный вопросик образовался. Как Вы планировали запустить мегу88 на 20 Мгц так чтобы 3 порта(24пина) остались свободными ?  Не берите в голову, учебный пример, чисто в образовательных целях.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 18 2007, 17:20
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(muravei @ Oct 18 2007, 13:19)  Ну почему же ? Для всякого рода "пропеллерных поделок" пойдет!  Согласен Цитата Кстати, зачем шаговым двигателям ШИМ? Дробление шага. Что обеспечивает более высокую плавность движения при более высокой максимальной скорости.
|
|
|
|
|
Oct 19 2007, 07:41
|

Местный
  
Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459

|
Цитата(=GM= @ Oct 17 2007, 17:34)  Внимательно прочтите посты #49 и #58. Во втором посте на словах описан мой алгоритм создания таблицы. Вы его поняли?
Похоже, где-то у вас недопонимание. Вот скажите, вы саму идею уловили, как это всё работает? Если уловили, напишите сюда своими словами. И вам станет понятнее, и я пойму, почему у вас смазка с лыж испаряется(:-). посты читал уже не раз, лыжи не едут..:-) хм.. постараюсь объяснить как я понимаю Ваш метод: 1. период шима делится на прерывания (предустановками). причем с неравными интервалами! т.е. к примеру с шагом 1,2,4,8,16,32,64,128,255 (8шт. за период.) 2. В каждое прерывание в порты устанавливается их образ(портов)(выводим значение из таблицы). 3. таким образом если мы на одном прерывании (третем по счету) (к примеру!) на первый ПИН(!) портаА установим 1(един.), и к примеру на 5-ом по счету прерывании на тоже пин поставим (1)единицу, а в остальные прерывания там будет 0(ноль), то сложив интервал 3-го и 5го прерывания(4+16=20) получим значение заполнение 20/255. так можно установить любой уровень от 0 до 255. вот, что не так?
--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
|
|
|
|
|
Oct 19 2007, 10:16
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(add @ Oct 19 2007, 07:41)  посты читал уже не раз, лыжи не едут...вот, что не так? Всё не так. 1. Период шима не делится на прерывания c неравными интервалами. Давайте для простоты рассмотрим пример, состоящий из трёх шим. Сигналы шим выглядят так. Код 0 9 255 0 9 __ _____________________________________ _ |___________| |___________| шим 1
0 7 0 7 __ _________________________________________ _ |_______| |_________| шим 2 0 15 0 15 __ _______________________________ _ |_________________| |______________| шим 3 Сколько будет прерываний? Три – на временных позициях 7, 9 и 15. И еще одно общее прерывание - на позиции 0 (общее обнуление для всех каналов). Если у вас таймер считает с 0, а в регистр сравнения вы запишете 7, то при совпадении времени таймера (Т) с 7 у вас возникнет прерывание по сравнению. В прерывании вы должны будете установить шим2 в единицу и не трогать остальные. Кроме того вы должны будете записать новое число в регистр сравнения, а именно 9. При совпадении (Т=9) опять возникнет прерывание, надо будет выставить шим1 в единицу, не трогая остальные каналы, и не забыть записать в регистр сравнения новое число 15. На третьем прерывании выполняются те же действия, только с шим3. Больше прерываний не будет вплоть до 0 позиции, где программа обработки прерывания по переполнению обнулит все каналы и запишет число 9 в регистр сравнения. Далее начинается новый период шим, всё повторяется. (Абсолютно те же рассуждения приложимы к другому числу каналов. Само собой разумеется, что для 24 каналов, будет 24 прерывания.) 2. Таблица образа портов Таблица для случая с тремя шимами примет следующий вид. Код уставка 321 <-номер шим 7 0000 0010 <-образ порта при Т=7 9 0000 0011 <-образ порта при Т=9 15 0000 0111 <-образ порта при Т=15 3. Алгоритм подготовки таблицы образа портов был описан ранее. 4. Исходные данные представляются в виде таблицы. Для случая трёх шим она выглядит следующим образом. Код уставка канал 9 1 7 2 15 3 Её надо отсортировать в порядке неубывания уставок Код уставка канал 7 2 9 1 15 3 И в соответствии с упорядоченной таблицей построить таблицу образов портов. 5. В первом приближении размер кванта времени, или длительность ступеньки, определяется временем выполнения прерывания. Минимальное время ступеньки составит 25 МЦ (18МЦ (обработка прерывания) + 4МЦ(вход в прерывание) + 3МЦ (завершение команд на входе и выходе) ). Время ступеньки 25 МЦ * 0.05 мкс/МЦ = 1.25 мкс. Период шима 1.25 мкс*256 ступеней=320 мкс, т.е. частота шим = 3125 Гц. Полное время можно сократить примерно в два раза и получить 13 МЦ.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 19 2007, 10:37
|

Местный
  
Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459

|
Цитата(=GM= @ Oct 19 2007, 14:16)  Всё не так. 1. Период шима ... =GM=, Пасиба что расжевали! Лыжи поехали:-) (Вот токо с подготовкой подразберусь:-)) зы: а способ (.пост №73:неравными интервалами! т.е. к примеру с шагом 1,2,4,8,16,32,64,128,255) шим имеет право на жизнь? Там прерываний всего 8 (от разрядности зависит,можно 16) Какие там могут быть подводные камни?
--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
|
|
|
|
|
Oct 19 2007, 11:18
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(add) Какие там могут быть подводные камни? Не дорос ещё =GM= до этого алгоритма   А вообще алгоритм идеальный для управления светодиодами напрямую.
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Oct 19 2007, 12:04
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(add @ Oct 19 2007, 09:37)  =GM=, Пасиба что расжевали! Лыжи поехали:-) зы: а способ (.пост №73:неравными интервалами! т.е. к примеру с шагом 1,2,4,8,16,32,64,128,255) шим имеет право на жизнь? Там прерываний всего 8 (от разрядности зависит, можно 16) Какие там могут быть подводные камни? Там не камни, там под водой целый горный хребет(:-). Вы когда на лыжах будете съезжать, смотрите не наткнитесь(:-). Теоретически конечно можно перебрать все комбинации с 24 каналами и сделать соответствующее количество вариантов прерываний, чтобы получить заданную комбинацию 24 прерываний, но я не представляю, как это сделать в обозримое время на МК с ограниченными ресурсами.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 19 2007, 12:10
|

Местный
  
Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459

|
Цитата(=GM= @ Oct 19 2007, 16:04)  Там не камни, там под водой целый горный хребет(:-). Вы когда на лыжах будете съезжать, смотрите не наткнитесь(:-).
Теоретически конечно можно перебрать все комбинации с 24 каналами и сделать соответствующее количество вариантов прерываний, чтобы получить заданную комбинацию 24 прерываний, но я не представляю, как это сделать в обозримое время на МК с ограниченными ресурсами. Дык ненада там прерываний больше. Сколько бит , столько прерываний. А байт каждого канала раскидывается по столбцам. Я по этому и спрашивал как подготавливаете таблицу. (про ролы(rol) и роры(ror) говорил.) А всетаки они разные. :-)
--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
|
|
|
|
|
Oct 19 2007, 13:03
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(add @ Oct 19 2007, 11:10)  Сколько бит , столько прерываний. А байт каждого канала раскидывается по столбцам Ну, разжуйте теперь вы мне ваш алгоритм, видимо, я не так его понимаю, не дорос(:-) Что такое байт каждого канала, куда он раскидывается, в смысле по каким-таким столбцам?
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 19 2007, 14:13
|

Местный
  
Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459

|
Цитата(=GM= @ Oct 19 2007, 17:03)  Ну, разжуйте теперь вы мне ваш алгоритм, видимо, я не так его понимаю, не дорос(:-) Что такое байт каждого канала, куда он раскидывается, в смысле по каким-таким столбцам? Про "не дорос" я не говорил, прошу заметить.:-/ Как уже писал неоднократно, есть к примеру 8 прерываний (по числу битности). с интервалами кратными 1,2,4,8,16,32,64,128,256( длительность) . Теперь формируем образа портов: перый образ(первое прерывание кратное 1) :1-й бит 1-го байта, 1-й бит 2-го байта, .....1-й бит 24-го байта.Второй образ(второе прерывание кратное 2) :2-й бит 1-го байта, 2-й бит 2-го байта, .....2-й бит 24-го байта. И так все байты каждого канала. Далее выводим по прерыванию соответствующую строчку. все. те. значения яркости к примеру 9, для первого канала, остальные нули таблица будет такой: ;----32-ой канал...........................................1-ый канал .db0b0000000,0b0000000,0b0000000,0b0000001 ;1-е прерыв (вес 1) (образ портов) .db0b0000000,0b0000000,0b0000000,0b0000000;2-е прерыв (вес 2)(образ портов) .db0b0000000,0b0000000,0b0000000,0b0000000;3-е прерыв (вес 4)(образ портов) .db0b0000000,0b0000000,0b0000000,0b0000001;4-е прерыв (вес 8)(образ портов) .db0b0000000,0b0000000,0b0000000,0b0000000;5-е прерыв (вес 16)(образ портов) .db0b0000000,0b0000000,0b0000000,0b0000000;6-е прерыв (вес 32)(образ портов) .db0b0000000,0b0000000,0b0000000,0b0000000;7-е прерыв (вес 64)(образ портов) .db0b0000000,0b0000000,0b0000000,0b0000000;8-е прерыв (вес 128)(образ портов) Те. просто поместили байт(значение яркости св.диода) в таблицу, только в столбец..говоря проще..:-) в итоге получим последовательность на порту:1|t1|0|t2|0|t3|1|t4|0|t5|0|t6|0|t7|0 где t - интервал между прерываниями(кратными 1,2,4,8,16,32,64,128,256 ).. Ну вроде так. :-)
--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
|
|
|
|
|
Oct 19 2007, 16:07
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(add @ Oct 19 2007, 13:13)  Те. просто поместили байт(значение яркости св.диода) в таблицу, только в столбец...в итоге получим последовательность на порту: 1|t1|0|t2|0|t3|1|t4|0|t5|0|t6|0|t7|0 где t - интервал между прерываниями (кратными 1, 2, 4, 8, 16, 32, 64, 128, 256) Теперь понял(:-). Ну, во-первых, будет не шим, а "поразрядная кодоимпульсная модуляция" (пКИМ). Будет она работать? Теоретически будет, надо исследовать, как такая последовательность влияет на глаз человека. Во-вторых, загрузить из памяти в регистр и выдать для трёх портов можно за 9 МЦ минимум миниморум, пусть это будет квант младшего разряда, выдача для второго кванта будет полегче - 18 МЦ, для последующих - нет проблем, поскольку времени на выдачу будет не менее 36 МЦ. Следовательно, при той же разрядности в 8 бит, период пКИМ будет равен 9*256=2304 МЦ, т.е. частота пКИМ будет 8.7 кГц. Что выглядит совсем неплохо. Можно хлеще сделать, разместить первые, вторые и третьи 3 байта образов порта в 9 регистрах, тогда выдача в три порта займет 3 МЦ, значит, общий период пКИМ будет 3*256=768МЦ, а частота поднимется до 26 кГц. Последующие образы брать из памяти. Поскольку вам фактически надо транспонировать битную матрицу 8 х 24 в матрицу 24 х 8, то подготовку таблицы, наверное, лучше делать так. Разместить текущие 8 байт в регистры, с помощью 8 пар rol-rol получить текущий байт и сохранить его. Уйдёт где-то 480 МЦ, всего 480*3=1440 МЦ, т.е. период пКИМ будет не более 13 кГц. Вот вам одно фундаментальное ограничение. Может быть, можно придумать некий табличный способ, не знаю, надо думать. И еще останется выяснить, как будут жить такие короткие импульсы в системе. Стоит попробовать. Желаю удачи.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 19 2007, 20:59
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(GetSmart @ Oct 19 2007, 19:05)  =GM= по ходу не в теме  Глаз человека даже не заметит подмены. А вот симистору это не понравилось бы Симистору будет по барабану, т.к. он включится от третьего-четвёртого-пятого разряда, а потом выключится только через 10000 мкс (полпериода сети 50 Гц), пройдёт более 50 периодов шим. Будет ли он правильно работать, это уже другой вопрос. Что касается глаза, то известны опыты с чёрно-белым кружком (как волчок), когда он крутится, возникают цветные полосы. Где-то у меня такой волчок валялся, надо поискать...Откуда бы им взяться, если кружок чёрно-белый? Ешё была статья в журнале Радио, где описывалась схема формирующая цветную заставку из черно-белой... Все эти эффекты основаны на особенностях человеческого зрения, вот так...а вы не в теме, не в теме...
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 20 2007, 21:58
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(bzx @ Oct 19 2007, 23:00)  ... на вход внешнего логического элемента AND подаётся частота заполнения ШИМ (Fd). На второй вход - частота ШИМ (Fpwm). Таким образом сформирован 1 канал ШИМ. Т.к. частота заполнения ШИМ формируется уже не программно, а именно, не через прерывания таймера, а задаётся внешнем тактовым генератором, то можно снизить частоту прерываний таймера до частоты ШИМ. При таком раскладе значительно освобождаются вычислительные возможности контроллера в ~(Fd/Fpwm) раз Поясните, что вы понимаете под частотой заполнения шим и частотой шим? Например, непонятно, что вы подаёте на второй вход, меандр что ли? Или что?
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|