ШИМ на Mega8

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Аватара пользователя
Volgol_555
Потрогал лапой паяльник
Сообщения: 301
Зарегистрирован: Пт сен 23, 2011 13:13:51
Откуда: Минск
Контактная информация:

ШИМ на Mega8

Сообщение Volgol_555 »

Здравствуйте всем! Делаю небольшой стэндик для универа и нагорел ряд вопросов по поводу аппаратного ШИМ у atmega8. Использую я СodeVisionAVR (т.е. язык Си) и разумеется CodeWizard (входит в пакет СodeVisionAVR)
1) Какой бы я аппаратный ШИМ ни делал (т.е. вставлял разные частоты таймера), период ШИМ сигнала всегда равнялся 255 мс - так в Protoss осциллограф показывал. Разве так должно быть?
Как мне тогда сделать период сигнала скажем 10 мкс? Как вообще расчет сделать?
2) Основной вопрос! Писал плавный разгон двигателя при нажатии на одну кнопку и плавное торможение при нажатии на вторую кнопку используя аппаратный ШИМ у мега8 - ШИМ на ногу OCR2 (вопрос на сколько бит этот ШИМ?). Здесь я просто писал OCR2++ и OCR2-- при соответствующих кнопках
Так вот мне надо написать тот же ШИМ только на ногу OCR1, но у нее 2 регистра OCR1AL и OCR1AH. Не могу же я написать OCR1AL++ - проверял эффекта никакого.

Так вот вопрос, как мне сделать плавное нарастание на ноге OCR1A аналогично как на ноге OCR2 (т.е. OCR2++)???

Все основные настройки ШИМ я делал в Wizard, где для OCR2 я ставил в таймере 2 Fast PWM top=FFh, а что касательно настроек для OCR1 - ставил в таймере1 Fast PWM top=00FFh. И ставил часики на 125 кГц. Вот весь код программы:

#include <mega8.h>
#include <delay.h>
// Timer2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
// Place your code here
}

void main(void)
{
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=0 State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x08;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=Out Func1=Out Func0=In
// State6=T State5=P State4=P State3=T State2=1 State1=0 State0=T
PORTC=0x34;
DDRC=0x06;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=Out Func1=Out Func0=Out
// State7=T State6=T State5=T State4=T State3=1 State2=1 State1=1 State0=1
PORTD=0x0F;
DDRD=0x0F;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
// Mode: Fast PWM top=FFh
// OC2 output: Non-Inverted PWM
ASSR=0x00;
TCCR2=0x6C;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x40;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// Global enable interrupts
#asm("sei")

while (1)
{
if((PINC.5==0)&(OCR2!=255)) // увеличивать пока не достигло максиума
{
delay_ms(2); // задержка 10 мс.
OCR2++; //увеличиваем заполнение
}
if((PINC.4==0)&(OCR2!=0)) // уменьшать пока не достигло миниума
{
delay_ms(2); // задержка 10 мс.
OCR2--; //уменьшаем заполнение

};
}
}
Реклама
Аватара пользователя
GRAF
Мудрый кот
Сообщения: 1867
Зарегистрирован: Ср янв 23, 2008 22:11:54
Откуда: Калининград

Re: ШИМ на Mega8

Сообщение GRAF »

1) Комп слабый, не успевает обсчитать всё. Наверняка протеус выдает сообщение о том, что симуляция идет не в реальном режиме времени.
2) Таймер 2 у меги8 8-битный, смотрите в даташите.
По поводу регистров OCR1A и OCR1B. В библиотеке CVAVR есть хедер mega8.h, в нем прописан доступ к 16-битным регистрам. Таким образом, в командах можете к ним напрямую обращаться, OCR1A++, OCR1A-- и т.д.
Формулы для расчета частоты есть даташите.
Реклама
Аватара пользователя
Volgol_555
Потрогал лапой паяльник
Сообщения: 301
Зарегистрирован: Пт сен 23, 2011 13:13:51
Откуда: Минск
Контактная информация:

Re: ШИМ на Mega8

Сообщение Volgol_555 »

Уже становиться все понятней. Но есть опять же одно но: когда ШИМ написан для OCR2 -протосс все показывает и отлично. А когда для OCR1A, то протосс показывает как бы рывок при нажатии увеличения заполнения, но сразу же сдает назад - в исходное состояние!
Самое гениальное - всегда самое простое
Аватара пользователя
Volgol_555
Потрогал лапой паяльник
Сообщения: 301
Зарегистрирован: Пт сен 23, 2011 13:13:51
Откуда: Минск
Контактная информация:

Re: ШИМ на Mega8

Сообщение Volgol_555 »

А что касательно компа - поверьте он у меня достаточно мощный, чтобы я мог на нем обрабатывать такие вещи как симуляцию!
Самое гениальное - всегда самое простое
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Volgol_555
Потрогал лапой паяльник
Сообщения: 301
Зарегистрирован: Пт сен 23, 2011 13:13:51
Откуда: Минск
Контактная информация:

Re: ШИМ на Mega8

Сообщение Volgol_555 »

В общем попробовал ещё раз проделать все то же самое и у меня получилось сделать ШИМ на мега8 используя OCR1A++.
Ранее то же самое не получалось - может глюк компа, или мой собственный глюк в голове)).
Спасибо за активное участие!) :)
Самое гениальное - всегда самое простое
Реклама
Аватара пользователя
GRAF
Мудрый кот
Сообщения: 1867
Зарегистрирован: Ср янв 23, 2008 22:11:54
Откуда: Калининград

Re: ШИМ на Mega8

Сообщение GRAF »

В коде ошибка была.
Реклама
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»