roboforum.ru

Технический форум по робототехнике.

ШИМ на любую ногу. Задержка.

Раздел создан специально для людей которым интересна робототехника, но в силу разных причин они не знают с чего начать.
Задавайте ваши вопросы, какими бы простыми они не казались, постоянные посетители форума постараются ответить на них по мере своих сил.
Робот своими руками. Самодельный робот.

ШИМ на любую ногу. Задержка.

Сообщение Hedgehoguse » 25 мар 2012, 09:43

Доброго дня всем!
Пролог. Давно почитываю ваш сайт. Нравятся самоделки и проекты, порой интересно понаблюдать за созданием устройства. Самому тоже нравится поднапрячь мозги, но практического опыта все же не хватает.
Итак! Имеется контроллер ATmega16 на тестовой плате. Имеется очень большое желание плавного управления яркостью светодиода. Вполне логично, что для этого имеет смысл использования ШИМ, что я и делаю. Однако, если же хочу использовать не стандартную ногу OC1A, а любую на мой выбор, то придется изменить ШИМ. Отключаю ногу и ставлю два прерывания по сравнению и по переполнению. В одном случае устанавливаю нужную мне ногу, в другом сбрасываю. Однако, даже когда регистр OCR1A равен нулю, то все равно имеется некая задержка во времени, которая не дает моему светодиоду потухнуть полностью. Вот пример на COdeVision:

Код: Выделить всёРазвернуть
//Настройка таймера:
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 8000,000 kHz
// Mode: Fast PWM top=00FFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x01;
TCCR1B=0x09;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

//Включение прерываний:
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x14;

//Прерывания:
// Timer1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Place your code here
  PORTD.0=1;
}

// Timer1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
// Place your code here
  PORTD.0=0;
}


Задержка ШИМ.png


Собственно, вот и ситуация. А хотелось бы если не избавиться, то минимизировать эту задержку. Предполагаю, что это происходит в связи с обработкой прерывания, или нет? Возможно ли избавиться? Менять скорость ШИМ на более низкую не очень-то хотелось бы - а если не один светодиод решу сделать, а, допустим, 50. Тогда надо на максимальной скорости работать, чтобы успевать переключаться. Выходить на 10 битное разрешение тоже, наверное, будет неудобно.
Есть ли другие варианты решения? Гуру, подскажите! :-)
З.Ы. Глюканул форум, второй раз набиваю сообщение :-(
Hedgehoguse
 
Сообщения: 2
Зарегистрирован: 25 мар 2012, 08:46

Re: ШИМ на любую ногу. Задержка.

Сообщение TomaT » 26 мар 2012, 02:54

Сделай проверку в лоб: выставлять 1 только если OCR1A!=0
Аватара пользователя
TomaT
 
Сообщения: 354
Зарегистрирован: 25 июл 2007, 10:38
Откуда: Москва (Троицк, МО)
ФИО: Антон Миронов

Re: ШИМ на любую ногу. Задержка.

Сообщение Hedgehoguse » 26 мар 2012, 03:32

Пробовал, но при этом получается некий скачок. Светодиод не плавно загорается, а начиная с состояния 0x0F, т.е. первые 16 позиций тупо "прощелкиваются".
Hedgehoguse
 
Сообщения: 2
Зарегистрирован: 25 мар 2012, 08:46

Re: ШИМ на любую ногу. Задержка.

Сообщение Duhas » 26 мар 2012, 08:04

а такт у таймера какой ? а то могет оч быстрый.. и просто не успеваешь выйти с прерывания и обработать..
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович


Вернуться в Новичкам или основы основ роботостроения.

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

cron