Здравствуйте всем! Делаю небольшой стэндик для универа и нагорел ряд вопросов по поводу аппаратного ШИМ у 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--; //уменьшаем заполнение
};
}
}
ШИМ на Mega8
- Volgol_555
- Потрогал лапой паяльник
- Сообщения: 301
- Зарегистрирован: Пт сен 23, 2011 13:13:51
- Откуда: Минск
- Контактная информация:
- Реклама
Re: ШИМ на Mega8
1) Комп слабый, не успевает обсчитать всё. Наверняка протеус выдает сообщение о том, что симуляция идет не в реальном режиме времени.
2) Таймер 2 у меги8 8-битный, смотрите в даташите.
По поводу регистров OCR1A и OCR1B. В библиотеке CVAVR есть хедер mega8.h, в нем прописан доступ к 16-битным регистрам. Таким образом, в командах можете к ним напрямую обращаться, OCR1A++, OCR1A-- и т.д.
Формулы для расчета частоты есть даташите.
2) Таймер 2 у меги8 8-битный, смотрите в даташите.
По поводу регистров OCR1A и OCR1B. В библиотеке CVAVR есть хедер mega8.h, в нем прописан доступ к 16-битным регистрам. Таким образом, в командах можете к ним напрямую обращаться, OCR1A++, OCR1A-- и т.д.
Формулы для расчета частоты есть даташите.
- Volgol_555
- Потрогал лапой паяльник
- Сообщения: 301
- Зарегистрирован: Пт сен 23, 2011 13:13:51
- Откуда: Минск
- Контактная информация:
Re: ШИМ на Mega8
Уже становиться все понятней. Но есть опять же одно но: когда ШИМ написан для OCR2 -протосс все показывает и отлично. А когда для OCR1A, то протосс показывает как бы рывок при нажатии увеличения заполнения, но сразу же сдает назад - в исходное состояние!
Самое гениальное - всегда самое простое
- Volgol_555
- Потрогал лапой паяльник
- Сообщения: 301
- Зарегистрирован: Пт сен 23, 2011 13:13:51
- Откуда: Минск
- Контактная информация:
Re: ШИМ на Mega8
А что касательно компа - поверьте он у меня достаточно мощный, чтобы я мог на нем обрабатывать такие вещи как симуляцию!
Самое гениальное - всегда самое простое
- Volgol_555
- Потрогал лапой паяльник
- Сообщения: 301
- Зарегистрирован: Пт сен 23, 2011 13:13:51
- Откуда: Минск
- Контактная информация:
Re: ШИМ на Mega8
В общем попробовал ещё раз проделать все то же самое и у меня получилось сделать ШИМ на мега8 используя OCR1A++.
Ранее то же самое не получалось - может глюк компа, или мой собственный глюк в голове)).
Спасибо за активное участие!)
Ранее то же самое не получалось - может глюк компа, или мой собственный глюк в голове)).
Спасибо за активное участие!)
Самое гениальное - всегда самое простое
- Реклама
Re: ШИМ на Mega8
В коде ошибка была.


