Технический форум по робототехнике.
Hamileon » 11 май 2006, 18:53
Програмный ШИМ на С. Что за МК видно ниже а также частоту ШИМ
Диод дополнительно подключен для себя. Захотелось вдеть еще одну дорожку и ее частоту для проверки верности расчета делителя.
Успехов. Хотя на своей шкуре испытал что лучше. Именно начать самому ну а потом уже можно подглядывать.
- Код: Выделить всё • Развернуть
#include <90s2313.h>
int pwm_t = 0; \\счетчик
int scv = 10; // Скважность - Мощность в процентах x 100. Те 10 это 100 процентов соотведственно 1 это 10%.
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
PORTB.3 = 0; Выключаем светодиод Те просто в окне будет выключатся включатся с частотой 2KHZ
if (pwm_t == 10) pwm_t = 0; Если нужно разьяснить это напишите
if (pwm_t == 0 ) PORTB.2 = 1;
if (pwm_t >= scv) PORTB.2 = 0;
pwm_t++;
TCNT0 = 0x06; //Значение от которого возобновляется счет. ЭТО НЕ КАКИМ БОКОМ НЕ ОТНОСИТЯ К ШИМ. ЭТО РАСЧЕТНАЯ ЧАСТЬ ЧТОБЫ ПОЛУЧИТЬ ЗАВЕТНУЮ ЧАСТОТУ 2. ТЕ Делитиель поделил итд но остались копейки то есть не ровно 2. И тут мы решаем что давайте всегда считать не от 0 до 255 а от 0x06 и в этом случае частота будет ровно 2.
}
void main(void) {
//TIMER0 initialize - prescale:8
// desired value: 2KHz
// actual value: 2,000KHz (0,0%)
TCCR0 = 0x00; //stop timer
TCNT0 = 0x06; //set count
TCCR0 = 0x02; //start timer
MCUCR = 0x00;
GIMSK = 0x00;
TIMSK = 0x02;
// Global enable interrupts
#asm("sei")
DDRB.2=1; \\Это моторка )
DDRB.3=1; \\Просто светодиод
while(1) {
PORTB.3 = 1; \\Просто включаем светодиод он к ШИМ никакого отношения не имеет просто мне так захотелось
}
}
Hamileon » 11 май 2006, 19:06
PS: Если будете тестить в VM LABe то поставте мощность не 10 те 100%
а меньше иначе можете перепугатся что нет ни каких перепадов ничего недвигается итд :P просто не забывайте что 100% это прямая.
avr123.nm.ru » 11 май 2006, 20:21
только скважность это величина противоположная величине ШИМ ! смотрите задачу 11.
и посмотрите там же как оформлять многострочный комментарий.
Hamileon » 12 май 2006, 03:49
while(1) {
if (PINB.3 == 0)scv++,Delay_10ms(1);
if (scv>10)scv = 10;
}
Или это описывается по другому ?
У меня в VMLab задержка нажатия и отпуска кнопки 6 мс.
В реальной жизни эта величина больше.
Кто как с этим борится и какие уже отработанные методы решения есть ?
avr123.nm.ru » 12 май 2006, 09:29
в курсе советую ВСЕГДА писать скобки { }
========
КодеВижен правильно делает паузы если ему сообщили частоту работы МК !
а VMLAB правильно их воспроизводит и показывает.
Hamileon » 12 май 2006, 14:24
ШИМ С. Управление мощностью двумя кнопками.
#include <90s2313.h>
int pwm_t = 0;
int scv = 0; // Скважность - Мощность в процентах x 100
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
if (pwm_t == 10) pwm_t = 0;
if (pwm_t == 0 ) PORTB.2 = 0;
if (pwm_t >= scv) PORTB.2 = 1;
pwm_t++;
TCNT0 = 0x06; //reload counter value
}
void main(void) {
//TIMER0 initialize - prescale:8
// desired value: 2KHz
// actual value: 2,000KHz (0,0%)
TCCR0 = 0x00; //stop timer
TCNT0 = 0x06; //set count
TCCR0 = 0x02; //start timer
MCUCR = 0x00;
GIMSK = 0x00;
TIMSK = 0x02;
// Global enable interrupts
#asm("sei")
DDRB.2=1;
DDRB.3=1;
//*******************
DDRB.3=0;
PORTB.3 = 1;
DDRB.4=0;
PORTB.4 = 1;
while(1) {
if (PINB.3 == 0){ while(PINB.3 == 0);scv++; }
if (scv>10)scv = 10;
if (PINB.4 == 0){ while(PINB.4 == 0);scv--; }
if (scv<0)scv = 0;
} }
Все 100% рабочее. Кнопка замыкается на землю. "B3 и B4"
Нет задержек кнопка работает по отпуску.
PS: To 123AVR я думаю несложно было догадатся что коментарии писал уже в форуме.
avr123.nm.ru » 12 май 2006, 16:07
ладно...
тогда вот это повторю:
скважность это величина противоположная величине ШИМ ! смотрите задачу 11.
Hamileon » 13 май 2006, 21:05