Отговори на тема  [ 75 мнения ]  Отиди на страница Предишна  1, 2, 3, 4, 5  Следваща
мултифункционален бутон + PWM 
Автор Съобщение
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 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
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Юни 21, 2011 9:51 pm
Мнения: 46
Местоположение: Bulgaria
Мнение 
е да де , в предния пост точно точно това се опитвах да кажа , че ми е проблем сетването на променливата както се изрази.


Сря Юни 29, 2011 5:36 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 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
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение 
Айде и сега някой да пусне и малко код как стават нещата с PWM-ите :)

Тази част на чаршавите на м-чип винаги ми се е струвала мноо мътна. И май не само на мене. Ама като го направиш един път и после се свиква.


Чет Юни 30, 2011 12:26 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение 
Cekins написа:
Айде и сега някой да пусне и малко код как стават нещата с PWM-ите :)

Тази част на чаршавите на м-чип винаги ми се е струвала мноо мътна. И май не само на мене. Ама като го направиш един път и после се свиква.


Нямам време за код, иначе бих пуснал, сигурно някъде имам по някой проект, ама да го намеря на асм ще е сложно, кой знае в кой архив е, от доста време основно на С карам.

Иначе с пускането няма грижи, много лесно става, е не е гъвкаво като при силабса, но се пуска по лесно ако ти е за пръви път. .. а за тоя проц дето го дадох по горе за съжаление не е в продукция още, но има други 12-ки с един pwm който също е напълно достатъчен.


Чет Юни 30, 2011 2:03 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Юни 21, 2011 9:51 pm
Мнения: 46
Местоположение: Bulgaria
Мнение 
нещо ми е пламнала главата и бавно схващам. @Cekins да наистина и код ще е добре но и така става.

да видим да ли съм разбрал имам имаме един импуслс 255 в който ако изхода светне само 1 път а останали 254 е изгаснал свето диода вързам към пина ще свети едва едва.

тогава колко максимално голям може да е ози импулс зада не се забелзва трептене на диода.



:evil: ако пак говоря глупости моля да ме извиниете и ще чакам някой да се смили и да го покаже в код :evil:


Чет Юни 30, 2011 2:23 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 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
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение 
Преди два три месеца правих една играчка с една бягаща светлина - беше с 18F2431 - Та той си има всичко необходимо - даже PWM-ите ги подавах като ОЕ на 3 595-ци. От там на сетне само въображение.

Иначе с 12-ка 3 софтуерни ШИМ-а си е само за светодиоди - за друго няма стане

ето малко нагледно ... http://www.arduino.cc/en/Tutorial/PWM


Чет Юни 30, 2011 9:07 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 11:41 am
Мнения: 1680
Мнение 
Я като заговорихте за PWM кажете, има ли MCU от което да изкарам 2 PWM изхода, но да мога да им задавам дефазиране. По принцип ми трябва 180 deg., ама няма да е зле ако може да се регулира. Предпочитам Microchip, да има и CAN Bus.


Чет Юни 30, 2011 9:55 am
Профил ICQ WWW
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 17, 2005 5:07 pm
Мнения: 813
Местоположение: Сливен
Мнение 
pachuka написа:
:evil: ако пак говоря глупости моля да ме извиниете и ще чакам някой да се смили и да го покаже в код :evil:


Айде прежалих една цигара да надраскам нещо примерно .. това е само с един таймер ()таймер2) с твоя пик на 8Мхз и 16us стъпка на PWM с честота 245Hz.
Можеше и по кратко да надраскам нещата но така мисля е по разбираемо .
:roll: :roll:

Код:
#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
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение 
Relsys , какво ще рече да са дефазирани? Периода на единия да започва от средата на другия или резултата от двата PWM-а да е дефазиран?


Чет Юни 30, 2011 6:45 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Юни 21, 2011 9:51 pm
Мнения: 46
Местоположение: Bulgaria
Мнение 
valioman като го писа сега неможе ли да го натъкмиш за моя код :D бъзикам се!
мерси много ама май ще имам нужда и от малко субтитри по кода. Понеже работя под MPLAb и след като го вмъкнах само за единия пин несе получи нищо. във общи линии функцията сетколор ме притеснява не се ли увеличава в нея една променлива която после намаляваме във прекъсването.

или проблеми е че мойто прекъсване е 256us а пика работа на 4Мхз


Чет Юни 30, 2011 7:41 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение 
Абе той го е написал ам ана С, аз верно МПЛАБ не съм ползвал от 7-8 години, ама последно вътре нямаше стандартно С.

А за процесора с дефазирнаи PWM ... абе мисля че на силабс имаха таква опция но не съм 100% сигурен, виж на ренесас поне по смонем имат тази възможност.


Чет Юни 30, 2011 8:15 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Вто Окт 03, 2006 11:58 am
Мнения: 924
Местоположение: Ботевград
Мнение 
pachuka написа:
valioman като го писа сега неможе ли да го натъкмиш за моя код :D бъзикам се!
мерси много ама май ще имам нужда и от малко субтитри по кода. Понеже работя под MPLAb и след като го вмъкнах само за единия пин несе получи нищо. във общи линии функцията сетколор ме притеснява не се ли увеличава в нея една променлива която после намаляваме във прекъсването.

или проблеми е че мойто прекъсване е 256us а пика работа на 4Мхз



Ето един код, дето го правих преди време.

#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 софтуерни ШИМ-а (дано не съм допуснал грешка при кастренето :D)
Писано е на CCS. Естествено, трябва да си го нагодиш за твоя контролер, фюзове, осцилатор и т.н.

P.S. Учи се от valioman, на мен доста ми е помагал, когато започнах с микроконтролерите (за което му благодаря!)


Чет Юни 30, 2011 8:34 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 11:41 am
Мнения: 1680
Мнение 
Cekins написа:
Relsys , какво ще рече да са дефазирани? Периода на единия да започва от средата на другия или резултата от двата PWM-а да е дефазиран?


Да, това ще рече, ако е 180 deg да започва от средата на първия.


Чет Юни 30, 2011 10:31 pm
Профил ICQ WWW
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 75 мнения ]  Отиди на страница Предишна  1, 2, 3, 4, 5  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 4 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни