реклама на сайте
подробности

 
 
> помогите с программкой, генерация ШИМ
essev
сообщение May 16 2010, 17:19
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 72
Регистрация: 16-05-07
Пользователь №: 27 757



Всем привет.

Устройство на АВР Мега16 реализует следующую логику:

Нажимаем кнопку и плавно зажигается светодиод - далее он горит на максимум.
Если еще раз нажать кнопку, то светодиод тухнет.

Написал программку, проверил все в протеусе (версия 7.6)...работает нормально. Но в железе тупит нереально.
Светодиод плавно загорается и после этого тухнет, хотя кнопку не нажимал...

Антидребезг сделал простой задержкой на 80 мс. Но проблема не исчезла.
Кварц - внутренняя RC-цепочка 8 Мгц

Помогите, пожалуйста. Все файлы прилагаются
Прикрепленные файлы
Прикрепленный файл  pwm_maks.rar ( 39.08 килобайт ) Кол-во скачиваний: 21
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
skilful
сообщение May 16 2010, 19:34
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 186
Регистрация: 23-04-06
Из: Сочи
Пользователь №: 16 411



Цитата(mempfis_ @ May 16 2010, 22:23) *
Забавная идея постоянно вися в ISR после возникновения прерывания генерировать шимированный сигнал.


ну задача получилась такая, что ШИМ генерится однократно и плавно зажигается диод только после нажатия кнопки.

Цитата(mempfis_ @ May 16 2010, 22:23) *
Во-первых зачем использовать long int там где обычного int вполне достаточно.


с этим полностью согласен

Цитата(mempfis_ @ May 16 2010, 22:23) *
Во-вторых при входе в обработчик прерываний ставить кучу задержек - плохая идея.


а как победить дребезг. Существует вроде несколько программных способов, но почему задержки плохо?

Цитата(mempfis_ @ May 16 2010, 22:23) *
В-третьих конструкция PWM_PORT &= (0<<PWM_PIN); не имеет смысла если хотите сбросить пин управления светодиодом.
Поставте чтоли PWM_PORT &= ~(1<<PWM_PIN);

что в протеусе, что в авр студии сбрасывается хорошо smile.gif


Цитата(mempfis_ @ May 16 2010, 22:23) *
По-поводу программы.
У вас сложно реализовано зажигание светодиода, пауза, гашение в void pwm_gen(unsigned int cmp16);
Упростите до:
void pwm_gen(unsigned int cmp16) //программная генерация ШИМ
{
PWM_PORT |= (1<<PWM_PIN); //зажгли

while(cmp16--); //подождали

PWM_PORT &= ~(1<<PWM_PIN); //погасили
};


спасибо - упрощу smile.gif


Цитата(mempfis_ @ May 16 2010, 22:23) *
MCUCR |= (1 << ISC01) | (0 << ISC00); - лень искать в документации по какому фронту тут устанавливается генерирование прерываний.
Если по обоим то возможно выключается по второму фронту.
Действительно ли вызов функций pause обеспечивает 80 мС? Проверте - может быть антидребезг не работает.


авр студио дает 20 мс на ф-ю pause

Цитата(mempfis_ @ May 16 2010, 22:23) *
Как вариант попробуйте очищать флаг внешнего прерывания при выходе из обработчика ISR.

ок

Цитата(mempfis_ @ May 16 2010, 22:23) *
Ну и может стоит в целом пересмотреть концепцию построения программы?
Использовать таймер-счётчик в режиме ШИМ, ввести опрос кнопки с програмным антидребезгом, вместо висения в ISR использовать установку флага что было прерывание и обрабатывать его в основном цикле программы.


спасибо за должную критику smile.gif я проги не часто пишу - вот поэтому столько кривостей.
но пока не понятно почему обработчик прерывания в реальной железке с ума сходит...
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 11:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.01366 секунд с 7
ELECTRONIX ©2004-2016