|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 8:56 am
мултифункционален бутон + PWM
| Автор |
Съобщение |
|
valioman
Ранг: Почетен член
Регистриран на: Съб Сеп 17, 2005 5:07 pm Мнения: 813 Местоположение: Сливен
|
Ехейй човече спри се ... я прочети какво значи PWM или ШИМ по нашенски .
С две приказки според честотата на "мигане" на всеки диод си определяш разделителна способност да речем 100us или колкото ти е там настроено прекъсването на таймера.
имаш 3 променливи R G B които се изменят от 0 до 255 ..
правиш си функция в която
1. сетваш променливите
2.Вдигаш краката в 1 ца.
и в прекъсването на таймера намаляш R G B с 1 и проверяваш кога ще станат 0 сетвайки съответния крак в 0.
това е за един период на PWM-a .
другото е 3 цикъла да организираш логиката .
Малко образно се изразих ама надявам се да разбереш горе долу смисъла
|
| Сря Юни 29, 2011 5:03 pm |
|
 |
|
pachuka
Ранг: Минаващ
Регистриран на: Вто Юни 21, 2011 9:51 pm Мнения: 46 Местоположение: Bulgaria
|
е да де , в предния пост точно точно това се опитвах да кажа , че ми е проблем сетването на променливата както се изрази.
|
| Сря Юни 29, 2011 5:36 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
Абе ти май не можеш да разбереш идеята на ШИМ-а, там честоата е постоянна, не се мени, мени се коефициента на зпълване, демек ако имаш честота 1 khz, периода ти е 1 мс. коефициент на запълване 50% е когато платото на импулса ти е 0.5 мс. Менейки продължителността на импулса се мени коефициента на запълване, респективно мощността която се излъчва от светодиода.
Да го направиш е сранвително лесно, принципно е по добре да е хардуерно, но няма проблем и да е софтуерно.
Нагласяш си таймер 1 да цъка да речем на 256 khz, т.е. и си слагаш и прекъсване. В прекъсването попрепълване вдигаш пина който искаш да управляваш в 1-ца, а в прогрматаа си полираш таймер 1 като го сравняваш с коефициента които искаш, когато стойостта на таймер 1 стане по голяма от стойноста на запълване сваляш изхода в 0. Това е всичко.
Тов ае най простото обеснение. Като искаш да мениш интензитета, мениш променливата с която сравняваш таймер 1. В твоя случай имаш 3 изхода, за трите светодиода. Значи пускаш си таймер 2 или пък ако искаш може и същия таймер 1 да позлваш, и на всяко препълване си мениш тази променлива, инкрементваш я с 1. Като я превъртиш от 0 до -255 просто почваш да управялваш другият изход.
Това е най-елемнтарно описано, писал съм таймер 1-2, зависи от това с какъв процесор си може и да нямаш таймер 1 ил 2, но идеята е тази.
p.s. сега гледам някаква 12F1501, виждам че има 4 10 битови PWM модула, което ти решава перфектно всички проблеми.
|
| Сря Юни 29, 2011 8:36 pm |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
Айде и сега някой да пусне и малко код как стават нещата с PWM-ите
Тази част на чаршавите на м-чип винаги ми се е струвала мноо мътна. И май не само на мене. Ама като го направиш един път и после се свиква.
|
| Чет Юни 30, 2011 12:26 am |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
Нямам време за код, иначе бих пуснал, сигурно някъде имам по някой проект, ама да го намеря на асм ще е сложно, кой знае в кой архив е, от доста време основно на С карам.
Иначе с пускането няма грижи, много лесно става, е не е гъвкаво като при силабса, но се пуска по лесно ако ти е за пръви път. .. а за тоя проц дето го дадох по горе за съжаление не е в продукция още, но има други 12-ки с един pwm който също е напълно достатъчен.
|
| Чет Юни 30, 2011 2:03 am |
|
 |
|
pachuka
Ранг: Минаващ
Регистриран на: Вто Юни 21, 2011 9:51 pm Мнения: 46 Местоположение: Bulgaria
|
нещо ми е пламнала главата и бавно схващам. @Cekins да наистина и код ще е добре но и така става.
да видим да ли съм разбрал имам имаме един импуслс 255 в който ако изхода светне само 1 път а останали 254 е изгаснал свето диода вързам към пина ще свети едва едва.
тогава колко максимално голям може да е ози импулс зада не се забелзва трептене на диода.
 ако пак говоря глупости моля да ме извиниете и ще чакам някой да се смили и да го покаже в код 
|
| Чет Юни 30, 2011 2:23 am |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
Ами горе долу си разбрал, само че ти не подаваш числото 255 към пина, към пина не се подава число, той има само стойност :
movfw 0x10
subwf 0x01,0
btfss status,c
bcf 0x06.1
NOP
Те това е .. не съм писал на асемблер от доста време тъй че .... надявам се да не съм те излъгал много, май още помня на пикльо командите. Та на адрес 0х10 ти е променливата която определя коефициента на запълване, нея ще я мениш за да се мени яркостта. 0х01 по спомен е таймер, 06.1 ти е порт В.1 .. пак по спомен. Та това нещо ти стои в loop в основната програма, и това само по себе си е достатъчно за реализиране на ШИМ-а. Когато променливата ти е по голяма от таймера кери бита ти е 1-ца, съответно bcf се скипва и отива на NOP, когато стане по малък кери бита ти е 0 и минаваш през нулиране на изхода, единствено в прекъсване от препълване трбвва да си сложиш сетването на бита, но то може да става и пак там в loop-а.
Така това ти е ШИМ-а, честотата му зависи от честоата с която клокваш таймера, ако го клокваш с 100 khz честотата на ШИМ-а ще ти е 390 Hz, това е достатъчно за да е незабелижимо. Дали ШИМ-а ще е 1% или 100% няма особенна разлика.
|
| Чет Юни 30, 2011 5:41 am |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
Преди два три месеца правих една играчка с една бягаща светлина - беше с 18F2431 - Та той си има всичко необходимо - даже PWM-ите ги подавах като ОЕ на 3 595-ци. От там на сетне само въображение.
Иначе с 12-ка 3 софтуерни ШИМ-а си е само за светодиоди - за друго няма стане
ето малко нагледно ... http://www.arduino.cc/en/Tutorial/PWM
|
| Чет Юни 30, 2011 9:07 am |
|
 |
|
relsys
Ранг: Форумен бог
Регистриран на: Пет Ное 25, 2005 11:41 am Мнения: 1680
|
Я като заговорихте за PWM кажете, има ли MCU от което да изкарам 2 PWM изхода, но да мога да им задавам дефазиране. По принцип ми трябва 180 deg., ама няма да е зле ако може да се регулира. Предпочитам Microchip, да има и CAN Bus.
|
| Чет Юни 30, 2011 9:55 am |
|
 |
|
valioman
Ранг: Почетен член
Регистриран на: Съб Сеп 17, 2005 5:07 pm Мнения: 813 Местоположение: Сливен
|
Айде прежалих една цигара да надраскам нещо примерно .. това е само с един таймер ()таймер2) с твоя пик на 8Мхз и 16us стъпка на PWM с честота 245Hz.
Можеше и по кратко да надраскам нещата но така мисля е по разбираемо .
 |  |  |  | Код: #include ".\rgb_pwm.h" #byte portb=0x06 #bit pinR=portb.4 #bit pinG=portb.5 #bit pinB=portb.6
typedef struct{ int R; int G; int B; int Rmax; int Gmax; int Bmax; int end; }_RGB;
_RGB rgb;
#INT_TIMER2 void isr_timer2(void) { if(rgb.R>0) rgb.R--; if(rgb.G>0) rgb.G--; if(rgb.B>0) rgb.B--; rgb.end++; if(rgb.end==255) { pinR=pinG=pinB=0; rgb.R=rgb.Rmax; rgb.G=rgb.Gmax; rgb.B=rgb.Bmax; pinR=pinG=pinB=1; }else { if(rgb.R==0)pinR=0; if(rgb.G==0)pinG=0; if(rgb.B==0)pinB=0; } }
void setcolor(int R,int G,int B) { disable_interrupts(int_timer2); pinR=pinG=pinB=0; rgb.R=rgb.Rmax=R; rgb.G=rgb.Gmax=G; rgb.B=rgb.Bmax=B; rgb.end=0; pinR=pinG=pinB=1; enable_interrupts(int_timer2); }
void efekt(int delay) { int _r,_g,_b; _r=_g=_b=255; for(_r=255;_r>=1;_r--) { setcolor(_r,_g,_b); delay_ms(delay); } for(_b=255;_b>=1;_b--) { setcolor(_r,_g,_b); delay_ms(delay); } for(_r=1;_r>=255;_r++) { setcolor(_r,_g,_b); delay_ms(delay); } for(_g=255;_g>=1;_g--) { setcolor(_r,_g,_b); delay_ms(delay); } for(_b=1;_b>=255;_b++) { setcolor(_r,_g,_b); delay_ms(delay); } for(_g=1;_g>=255;_g++) { setcolor(_r,_g,_b); delay_ms(delay); }
}
void main() {
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DIV_BY_16,1,1);//16 us interrupt 255*0.000016=0.00408 =245Hz 8MHZ clock setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); // enable_interrupts(INT_TIMER2); enable_interrupts(GLOBAL);
// TODO: USER CODE!! set_tris_b(0); rgb.R=rgb.G=rgb.B=0; rgb.end=255; pinR=pinG=pinB=0; setcolor(150,100,254); for(;;) { efekt(1); } }
|  |  |  |  |
|
| Чет Юни 30, 2011 1:14 pm |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
Relsys , какво ще рече да са дефазирани? Периода на единия да започва от средата на другия или резултата от двата PWM-а да е дефазиран?
|
| Чет Юни 30, 2011 6:45 pm |
|
 |
|
pachuka
Ранг: Минаващ
Регистриран на: Вто Юни 21, 2011 9:51 pm Мнения: 46 Местоположение: Bulgaria
|
valioman като го писа сега неможе ли да го натъкмиш за моя код  бъзикам се!
мерси много ама май ще имам нужда и от малко субтитри по кода. Понеже работя под MPLAb и след като го вмъкнах само за единия пин несе получи нищо. във общи линии функцията сетколор ме притеснява не се ли увеличава в нея една променлива която после намаляваме във прекъсването.
или проблеми е че мойто прекъсване е 256us а пика работа на 4Мхз
|
| Чет Юни 30, 2011 7:41 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
Абе той го е написал ам ана С, аз верно МПЛАБ не съм ползвал от 7-8 години, ама последно вътре нямаше стандартно С.
А за процесора с дефазирнаи PWM ... абе мисля че на силабс имаха таква опция но не съм 100% сигурен, виж на ренесас поне по смонем имат тази възможност.
|
| Чет Юни 30, 2011 8:15 pm |
|
 |
|
Zeus
Ранг: Почетен член
Регистриран на: Вто Окт 03, 2006 11:58 am Мнения: 924 Местоположение: Ботевград
|
Ето един код, дето го правих преди време.
#include <16F88.h>
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=8000000)
#bit led1=0x06.0 //PORTB.0
int x,y;
#int_TIMER0
void clock_isr()
{
disable_interrupts(INT_TIMER0);
if(y>x) led1=0;
if(y++>200) // нормално да е 255, но забелязах, че от 200 до 255 почти не се изменя яркостта
{
y=0;
if(x>0) led1=1;
};
set_timer0(200); // тук задаваш, колко често да влиза в прекъсването
enable_interrupts(INT_TIMER0);
}
void main()
{
setup_oscillator( OSC_8MHZ );
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
set_tris_b(0x00);
y=0;
while(true)
{
x=0; // тук си регuлираш времето за светене: 0-угаснал, 200-яркост на макс.
};
}
Малко го поокастрих, за да го разбереш по-добре, защото оригинално беше за 8 софтуерни ШИМ-а (дано не съм допуснал грешка при кастренето  )
Писано е на CCS. Естествено, трябва да си го нагодиш за твоя контролер, фюзове, осцилатор и т.н.
P.S. Учи се от valioman, на мен доста ми е помагал, когато започнах с микроконтролерите (за което му благодаря!)
|
| Чет Юни 30, 2011 8:34 pm |
|
 |
|
relsys
Ранг: Форумен бог
Регистриран на: Пет Ное 25, 2005 11:41 am Мнения: 1680
|
Да, това ще рече, ако е 180 deg да започва от средата на първия.
|
| Чет Юни 30, 2011 10:31 pm |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 3 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|