Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: 2 кан. АЦП + 2 канала ШИМ (Fast PWM) на tyny13 такое возможно?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Genri
Я полный чайник в программировании МК, это мой первый проект на avr, поэтому просьба сильно ногами не пинать.
Пытаюсь решить задачу на tyny13.
Задача:
Организовать 2 канала АЦП (8 разрядов) независимо управляющих 2-мя каналами ШИМ (желательно Fast PWM).
Алгоритм работы такой- устройство поочередно оценивает каждый входной канал и в зависимости от уровня сигнала управляет скважностью соответствующего канала ШИМ.
На входы АЦП планирую подавать аудиосигнал.
Проверяю проект в Протеусе, он показывает что работает только один канал ШИМ (OC0A).
Своим г#внокодом вас грузить не буду только задам вопросы.
Вопросы:
1.Поддерживает ли tyny13 Fast PWM по двум каналам одновременно?
2. Если нет то каким образом можно решить поставленную задачу?
3.Можно ли не использовать делитель тактового сигнала если я использую 8 разрядов АЦП?
ARV
1. поддерживает
2. см. п.1
3. делитель тактового сигнала не связан с числом используемых разрядов АЦП - все равно он будет 10 бит насчитывать
Xenia
Цитата(Genri @ Nov 29 2010, 21:24) *
1.Поддерживает ли tiny13 Fast PWM по двум каналам одновременно?

У нее же всего один таймер, поэтому на разных каналах можно только скважность разную установить, но частоту на каналах разной не сделаешь.

Цитата(Genri @ Nov 29 2010, 21:24) *
2. Если нет то каким образом можно решить поставленную задачу?

Взять контроллер, у которого 2 или больше таймеров.

Цитата(Genri @ Nov 29 2010, 21:24) *
3.Можно ли не использовать делитель тактового сигнала если я использую 8 разрядов АЦП?

А что мешает использовать все разряды? В крайнем случае можно сдвинуть число вправо на 2 разряда - вот и останется 8 бит (старших).
Genri
Цитата(ARV @ Nov 29 2010, 22:14) *
1. поддерживает
2. см. п.1
3. делитель тактового сигнала не связан с числом используемых разрядов АЦП - все равно он будет 10 бит насчитывать

Спасибо за оперативный ответ.
Значит буду дальше вправлять мозги МК и себе заодно smile.gif

Цитата(Xenia @ Nov 29 2010, 22:28) *
У нее же всего один таймер, поэтому на разных каналах можно только скважность разную установить, но частоту на каналах разной не сделаешь.


Взять контроллер, у которого 2 или больше таймеров.


А что мешает использовать все разряды? В крайнем случае можно сдвинуть число вправо на 2 разряда - вот и останется 8 бит (старших).

Вам тоже большое спасибо за ответ.
Разная частота как раз и не нужна, нужна именно скважность зависящая от уровня входного сигнала.
Не-е-е контроллер менять никак нельзя, я их что зря что ли 10 штук купил smile.gif
Кроме сильно ограниченных знаний и навыков ничто не мешает использовать все 10 разрядов АЦП, но для моих целей вполне достаточно 8 разрядов smile.gif
777777
Цитата(Xenia @ Nov 29 2010, 22:28) *
У нее же всего один таймер, поэтому на разных каналах можно только скважность разную установить, но частоту на каналах разной не сделаешь.

Автору, как я понял, это и не требуется.

Цитата(Xenia @ Nov 29 2010, 22:28) *
Взять контроллер, у которого 2 или больше таймеров.

Записывать значения в регистры OCR0A и OCR0B и получать два сигнала с разной скважностью.

Цитата(Xenia @ Nov 29 2010, 22:28) *
А что мешает использовать все разряды? В крайнем случае можно сдвинуть число вправо на 2 разряда - вот и останется 8 бит (старших).

Если поставить бит ADLAR в регистре ADMUX то ничего сдвигать не нужно - старшие 8 бит будут в ADCH. В этом случае разрешается читать только ADCH, а ADCL игнорировать.

Вот только назначение устройства не очень понято - нужно аналоговый сигнал преобразовывать в ШИМ? А потом? Фильтровать будешь?

Цитата(Genri @ Nov 30 2010, 00:03) *
Кроме сильно ограниченных знаний и навыков ничто не мешает использовать все 10 разрядов АЦП

Я полагаю, мешать может лишь разрядность таймера smile.gif
Genri
Цитата(777777 @ Nov 30 2010, 09:47) *
Автору, как я понял, это и не требуется.


Записывать значения в регистры OCR0A и OCR0B и получать два сигнала с разной скважностью.


Если поставить бит ADLAR в регистре ADMUX то ничего сдвигать не нужно - старшие 8 бит будут в ADCH. В этом случае разрешается читать только ADCH, а ADCL игнорировать.

Вот только назначение устройства не очень понято - нужно аналоговый сигнал преобразовывать в ШИМ? А потом? Фильтровать будешь?


Я полагаю, мешать может лишь разрядность таймера smile.gif

Делаю все как вы сказали то есть записываю поочередно значения ADCH в регистры OCR0A и OCR0B (бит ADLAR установлен).
Назначение устройства примитивное к выходам ШИМ подключаю аналоговые (стрелочные) индикаторы, поэтому думаю что фильтровать ничего не надо.
777777
Цитата(Genri @ Nov 30 2010, 10:47) *
Делаю все как вы сказали то есть записываю поочередно значения ADCH в регистры OCR0A и OCR0B (бит ADLAR установлен).
Назначение устройства примитивное к выходам ШИМ подключаю аналоговые (стрелочные) индикаторы, поэтому думаю что фильтровать ничего не надо.

А зачем тогда вообще контроллер? Почему бы не подключить индикаторы сразу к аналоговым сигналам которые ты оцифровываешь?

ЗЫ. У стрелочных индикаторов есть индуктивность, поэтому если подавать на них импульсное напряжение, то к ним еще диод нужен.
Genri
Цитата(777777 @ Nov 30 2010, 11:25) *
А зачем тогда вообще контроллер? Почему бы не подключить индикаторы сразу к аналоговым сигналам которые ты оцифровываешь?

ЗЫ. У стрелочных индикаторов есть индуктивность, поэтому если подавать на них импульсное напряжение, то к ним еще диод нужен.

Подключить индикаторы к аналоговым сигналам напрямую так это слишком просто и неинтересно.... А тут хочется хоть немного разобраться с АВРми, да плюс еще на свободные выводы tiny в перспективе пару аналоговых датчиков температуры повесить.
С диодом проще будет разобраться smile.gif
Genri
Есть еще один вопрос к экспертам.
Пытаюсь эмулировать работу устройства в AVR_Studio, устанавливая часть бит в регистре ADCH и ADCL (ADLAR=1).
Пытаюсь загрузить ADCH в OCR0A (OCR0B) но он грузит только младшие два бита. Это так и должно быть?
Если правильно перевел даташит в ADCH должен быть 8 битный результат преобразования АЦП.
Или я не правильно понял?
И еще не понятно почему в процессе эмуляции таймер не считает TCNT0=0.
aspID
Цитата(Genri @ Nov 30 2010, 14:52) *
С диодом проще будет разобраться  smile.gif


Мне кажется, Вы не поняли, о чем Вам говорили. У стрелочных индикаторов существует назовем ее в данном случае "паразитная" индуктивность. Чтобы с ней бороться - следует включить в схему диод
Genri
Цитата(aspID @ Dec 1 2010, 19:08) *
Мне кажется, Вы не поняли, о чем Вам говорили. У стрелочных индикаторов существует назовем ее в данном случае "паразитная" индуктивность. Чтобы с ней бороться - следует включить в схему диод


Да вы действительно правильно заметили я не о том подумал.
Видимо имелось ввиду включение диода в обратном направлении параллельно катушке, аналогично диод включаются при подключении обмотки реле.
Если не ошибаюсь поможет не спалить выходы МК. Теперь правильно понял? smile.gif
aspID
Цитата(Genri @ Dec 2 2010, 14:38) *
Теперь правильно понял?  smile.gif


Да, именно так
Genri
Не могу заставить работать выход OC0B в режиме Fast PWM.
Подскажите пожалуйста как правильно настроить регистры?
Палыч
Цитата(Genri @ Dec 7 2010, 13:06) *
Не могу заставить работать выход OC0B в режиме Fast PWM.
Вы не забыли настроить РВ1 на вывод?
Genri
Цитата(Палыч @ Dec 7 2010, 15:14) *
Вы не забыли настроить РВ1 на вывод?

Да вроде нет.
DDRB=(1<<DDB5)|(0<<DDB4)|(1<<DDB3)|(0<<DDB2)|(1<<DDB1)|(1 << DDB0);
Палыч
Регистры таймера настроить? Как-то так:
Код
TCCR0A= (1<<COM0B1) | (1 /* или 0 */<<COM0B0) | (1<<WGM01) | (1<<WGM00);  // Fast PWM 0...FF
TCCR0B= (0 /* или 1 */<<CS02) | (0 /* или 1 */<<CS01) | (1<<CS00);  // Прескалер =1
OCR0B= 128; /* или что-то 0...255 */
Genri
Цитата(Палыч @ Dec 7 2010, 16:29) *
Регистры таймера настроить? Как-то так:
Код
TCCR0A= (1<<COM0B1) | (1 /* или 0 */<<COM0B0) | (1<<WGM01) | (1<<WGM00);  // Fast PWM 0...FF
TCCR0B= (0 /* или 1 */<<CS02) | (0 /* или 1 */<<CS01) | (1<<CS00);  // Прескалер =1
OCR0B= 128; /* или что-то 0...255 */


Большое спасибо вам Палыч. Железка в Протеусе начала подавать признаки жизни.
Правда из даташита я так и не понял каким битом в каком регистре инициализируется Fast Ethernet для OCB.
Палыч
Цитата(Genri @ Dec 8 2010, 10:20) *
Правда из даташита я так и не понял каким битом в каком регистре инициализируется Fast PWM для OCB.
Читайте в DS: "8-bit Timer/Counter0 with PWM" -> "Modes of Operation" -> "Fast PWM Mode" и "8-bit Timer/Counter0 with PWM" -> "8-bit Timer/Counter Register Description".

WGM2:0 - режим работы (mode), см. таблицу 32 (DS rev.E 10/04 - уж какая документация есть у меня) в Вашем случае = 3
COM0A1:0 (COM0В1:0) - управление выходом OC0A(OC0B), см. таблицы 27 и 29
CS02:0 - включение таймера и задание пределителя (т.е. задания частоты сигналов по формуле из п."Fast PWM Mode").
OCR0А (OCR0B) - длительность импульса/паузы (скважность).
Genri
Еще раз спасибо за пояснения.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.