PWM styrning av borstlös fläkt

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Benny
Inlägg: 20
Blev medlem: 8 juli 2004, 09:42:21
Ort: Tullinge, söder om Stockholm

PWM styrning av borstlös fläkt

Inlägg av Benny »

Jag vill reglera en fläkt (Elfa 54-129-11) med HPWM från en PIC16F74. Problemet är att lägsta frekvens PICen kan generera är ca 600Hz vid 10MHz klockfrekvens. Vad jag har lyckats Googla mig fram till är att borstlösa fläktar mår bäst av PWM styrning mellan 20 Hz till 150 Hz annars hänger inte elektroniken i dom med. Efter att ha provat med PICen och en IRL510 kan jag konstatera att det inte funkar något vidare med 600 Hz, har även provat att öka frekvensen men då snurrar knappt fläken alls.
Några idéer på hur man kan få ner frekvensen till lämplig nivå?
Att byta till en långsammare oscillator är inte aktuellt, PICen ska göra en hel del annat också så jag behöver hastigheten, kanske till och med måste öka till 20Mhz och då blir ju lägsta PWM 1,22KHz!
Användarvisningsbild
RDX*
EF Sponsor
Inlägg: 1646
Blev medlem: 28 maj 2003, 22:52:04
Ort: Skåne - Lund

Inlägg av RDX* »

Använd en timer interupt att räkna upp ett register. Då kan du dividera interupt frekvensen med max 255. Sen får du skriva en egen PWM funktion.
Benny
Inlägg: 20
Blev medlem: 8 juli 2004, 09:42:21
Ort: Tullinge, söder om Stockholm

Inlägg av Benny »

Hmm, det där förstod jag inte så mycket av, är ganska nybörjare på PICar. Du råkar inte ha nått exempel på hur man gör en sån grej i MBasic?
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

Använd timer1 (16bitar) med prescaler på 8.
Prescaler8 betyder att timern ökas med 1 var 8:e intern klockcykel.


Jag kan inte ditt programspråk så jag skriver så att alla borde förstå.


Du får ett interrupt när timer1 går från 65535 till 0, då hoppar ditt program till din
InterruptRutin:
if Timer_Interrupt_Flagga=1 goto Pwmrutin
Return_From_Interrupt

Pwmrutin:
if port=1 goto Pwm1
port=1 ;Ändra utgången till 1
Timer1=RäknareStart1 ; Ändra räknaren så att du får så lång 1:a på utgången som du vill
Timer_Interrupt_Flagga=0 ;Man måste radera flaggan när man är klar
Return_From_Interrupt

Pwm1:
port=0 ;Ändra utgången till 0
Timer1=RäknareStart0 ; Ändra räknaren så att du får så lång 0:a på utgången som du vill
Timer_Interrupt_Flagga=0 ;Man måste radera flaggan när man är klar
Return_From_Interrupt

Om interruptet är på och alla inställningar är rätt så blir det hela självgående.
I huvudprogrammet ska du bara ändra på RäknareStart1 och RäknareStart0.
Men en liten detalj bara, du måste förhindra att interruptrutinen läser av RäknareStart1 och RäknareStart0 om ditt huvudprogram bara har ändrat på en av dom. Den enklaste medoden är att stänga av interruptet innan ändrig och sätta på interruptet efter du har ändrat.
EDIT:
Vad jag menade är att RäknareStart1 och RäknareStart2 är 16bitars variabler dvs 2byte vardera och huvudprogrammet kan bara ändra en i taget så om det kommer ett interrupt när en byte är ändrad så får interruptrutinen fel värde.
Om man bara vill ha en byte från huvudprogrammet som ställer in pwm:en så kan man låta interruptrutinen räkna ut båda 16-bitars talen (man behöver ju inte mer än 8bitar för att bestämma farten på en fläkt).
Anledningen till att jag föreslog Timer1 som är 16bitar är för att få så låg pwm-rate som möjligt men det kanske kan bli bra även med Timer0 8bitar med prescaler 256 (Vid 10Mhz så får du en pwm-rate på c:a 38Hz)
EDIT END

Exempelvärden:
RäknareStart1 = 64536 Då får du en 1:a på porten som är 1000 räknarsteg lång
RäknareStart0 = 15536 Då får du en 0:a på porten som är 50000 räknarsteg lång
Senast redigerad av Chribbe76 12 juli 2004, 23:32:25, redigerad totalt 1 gång.
Benny
Inlägg: 20
Blev medlem: 8 juli 2004, 09:42:21
Ort: Tullinge, söder om Stockholm

Inlägg av Benny »

OK, tackar för hjälpen, det där borde jag klara av att få ihop i MBasic.
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

Vad är postscalern på Timer2 till för, och gå den inte att använda i samband med PWM? Eller postscale gäller bara för TMR2IF-flaggan och påverkar därmed inte PWM, etersom den går på samma signal som SSP-klockan!?
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

Det verkar vara som du säger att postscalern bara går till TMR2IF-flaggan.
Jag kan inte komma på något direkt användningsområde för den.
I samband med hårdvaru-pwm gör den nog ingen nytta.
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

Det är ju synd, den hade varit väldigt användbar i detta fallet.

En annan lösning hade ju varit om man skulle kunna sätta Timer2 att räkna upp efter en extern klocka (inte F(osc)/4). Men den funktionen finns tvärr inte, heller.. :?
Skriv svar