|
Lupus
Ранг: Форумен бог
Регистриран на: Сря Дек 01, 2004 12:44 am Мнения: 2811 Местоположение: София
|
 Re: PWM CONTROL
Добре дошъл във форума! Само че хайде да опитаме нещо:
1. Това, дето си го написал да е на кирилица и ако може не само с главни букви.
2. Да се опиташ да обясниш точно какво искаш да направиш и какво не става в няколко изречения (не само с едно).
3. Ние да се опитаме да разберем проблема ти и да отговорим.
Става ли?
|
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
Първо не е лошо д шиещ на кирилица, или най малкото не смао с големи букви.
После, какво точно те притеснява не разбирам. Настройваш си единия таймер да ти генерира прекъсване, да речем на всяка 1 ms. като влезеш в прекъсването инкрементираш един таймер, да речем pwm_time ...ето така
if(pwm_time<98)
{
pwm_time++ ;
}
else
{
pwm_time=0 ;
out_1=1;
out_2=1;
out_3 =1;
if(pwm_time>duty_1)
{
out_1=0;
}
if(pwm_time>duty_2)
{
out_2=0;
}
if(pwm_time>duty_3)
{
out_3=0;
}
}
kato out_1=1 e komandata s koiato wdigash bit ot izhoda w 1-ca
a samata programa ti e :
while(1)
{
if(in_1)
{
if(duty_1>99)
{
duty_1=100;
}
else
{
duty_1 ++;
}
delay_ms(50);
}
f(in_2)
{
if(duty_1<1)
{
duty_1=0;
}
else
{
duty_1 --;
}
delay_ms(50);
}
.......
.......
}
така, в прекъсването какво правиш, инкрементираш един брояч, pwm_time, който го инкрементираш от 1 до 100, това ти дава стъпката на регулиране от 0-100, като в случая PWM-а е с честота 10 Hz (100 стъпки по 1 ms). После имаш 3 променливи, duty_1, duty_2, duty_3 които ти дават запълването за всеки канал. Когато pwm_time стане по голямо от съответната променлива, изхода на канала става 0. Когато брояча pwm_time стигне 100 се установява отново в 0, като при това всички изходи ставт 1.
Това ти реализира PWM .. е с малки отмествания м-у трите канала но за светодиода това едва ли има голиамо значение.
в main върртиш един цикъл, в който проверяваш има ли натиснат бутон, в случая in_1 и in_2, като първото е up второто down за канал 1. Ако откриеш натиснат бутон проверяваш променливата,ако не е с гранична стойност я инкрементираш, или декрементираш, след това чакаш 50 ms ... т.е. ако натиснесх бутона всеки 50 мс ще променят стойноста на запълване с 1.
Това е разбира се най-елементарното решение, не е много добро бих реализирал по друг начин бутоните но те са без значение, нали те интересуваше PWM-а .. а и не ми се обеснява сега другата реализация.
}
|