roboforum.ru

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

Програмный ШИМ на С. Текст программы.

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

Програмный ШИМ на С. Текст программы.

Сообщение 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
 
Сообщения: 31
Зарегистрирован: 04 май 2006, 22:01
Откуда: Москва

Сообщение Hamileon » 11 май 2006, 19:06

PS: Если будете тестить в VM LABe то поставте мощность не 10 те 100%
а меньше иначе можете перепугатся что нет ни каких перепадов ничего недвигается итд  :P  просто не забывайте что 100% это прямая.
Hamileon
 
Сообщения: 31
Зарегистрирован: 04 май 2006, 22:01
Откуда: Москва

Сообщение avr123.nm.ru » 11 май 2006, 20:21

только скважность это величина противоположная величине ШИМ !  смотрите задачу 11.

и посмотрите там же как оформлять многострочный комментарий.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Какой алгоритм работы задержки на кнопку ?

Сообщение Hamileon » 12 май 2006, 03:49

while(1) {        
           if (PINB.3 == 0)scv++,Delay_10ms(1);
           if (scv>10)scv = 10;      
}          

Или это описывается по другому ?
У меня в VMLab задержка нажатия и отпуска кнопки 6 мс.
В реальной жизни эта величина больше.

Кто как с этим борится и какие уже отработанные методы решения есть ?
Hamileon
 
Сообщения: 31
Зарегистрирован: 04 май 2006, 22:01
Откуда: Москва

Сообщение avr123.nm.ru » 12 май 2006, 09:29

в курсе советую ВСЕГДА писать скобки   {     }

========

КодеВижен  правильно делает паузы если ему сообщили частоту работы МК !

а VMLAB правильно их воспроизводит и показывает.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Сообщение 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 я думаю несложно было догадатся что коментарии писал уже в форуме.
Hamileon
 
Сообщения: 31
Зарегистрирован: 04 май 2006, 22:01
Откуда: Москва

Сообщение avr123.nm.ru » 12 май 2006, 16:07

ладно...

тогда вот это повторю:

скважность это величина противоположная величине ШИМ !  смотрите задачу 11.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Сообщение Hamileon » 13 май 2006, 21:05

:)
Hamileon
 
Сообщения: 31
Зарегистрирован: 04 май 2006, 22:01
Откуда: Москва


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

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

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