PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : "SwitchPWM" - ?



Jörn Arne
25.03.2007, 18:01
Hallo zusammen

Irgendwann hatte ich mal den Einfall, zu versuchen, ob man den PWM Port eines µC via Multiplexing auf 'beliebig' viele Kanäle erweitern kann, das habe ich mir ähnlich wie das Multiplexing eines Dotmatrix oder 7-Segment -Feldes vorgestellt. Eine LED soll für eine bestimmte Zeit mit dem PWM Port verbunden werden und dann wieder getrennt. Der PWM Wert wird verändert und auf eine andere LED für die gleiche Zeit ausgegeben.

Ich weiß nicht ob das geht oder ob das schon realisiert wurde, deswegen der Thread. Weiter unten habe ich einen kleinen Schaltplan von meiner Testschaltung und das Assembler Listing des PIC

Das Multiplexing wird durch einen 4017 realsiert, der nach jedem Takt eine LED weiter schaltet

Hier mal das Listing:





include "p16f627.inc"

ERRORLEVEL -205
ERRORLEVEL -203

pwmPort equ d'3'
switchClock equ d'7'
switchReset equ d'6'

channelSelect equ 0x20
maxVal equ d'9' ;number of LEDs + 1
actualValue equ 0x22

pwmParamPort1 equ 0x30
pwmParamPort2 equ 0x31
pwmParamPort3 equ 0x32
pwmParamPort4 equ 0x33
pwmParamPort5 equ 0x34
pwmParamPort6 equ 0x35
pwmParamPort7 equ 0x36
pwmParamPort8 equ 0x37
pwmParamPort9 equ 0x38
pwmParamPort10 equ 0x39

org 0x00
goto init
org 0x04
;interrupt
retfie
init

MOVLW B'00000111' ;Disable Comparator module's
MOVWF CMCON

bcf T2CON, T2CKPS1 ;preScaler PWM
bcf T2CON, T2CKPS0
bsf T2CON, TMR2ON

BSF STATUS,RP0 ;bank 1
MOVLW B'11010111'
MOVWF OPTION_REG ;Write the OPTION register.
CLRF INTCON ;Disable interrupts
MOVLW B'00000000'
MOVWF TRISB ;RB7..RB0 are outputs.

movlw d'255' ;PWM freq
movwf PR2
BCF STATUS,RP0 ;Bank 1
CLRF PORTB ;clear portB

clrf CCP1CON
BSF CCP1CON, CCP1M3
BSF CCP1CON, CCP1M2

movlw d'0' ;PWM channelValues
movwf pwmParamPort1
movlw d'20'
movwf pwmParamPort2
movlw d'40'
movwf pwmParamPort3
movlw d'60'
movwf pwmParamPort4
movlw d'80'
movwf pwmParamPort5
movlw d'100'
movwf pwmParamPort6
movlw d'120'
movwf pwmParamPort7
movlw d'140'
movwf pwmParamPort8
movlw d'160'
movwf pwmParamPort9
movlw d'180'
movwf pwmParamPort10

movlw maxVal ;connected LEDS
movwf channelSelect ;selected channel
bcf PORTB, switchReset ;RESET PIN of 4017 low

goto main
;-----------------------------------
loadChannel
movlw 0x30 ;pointer offset
addwf channelSelect, w ;add selected channel
movwf FSR ;adress
movf INDF, w ;load Value
movwf actualValue ;pwmParamPort n -> actualValue
return
;-----------------------------------
writePWM
movf actualValue, W ;write pwmParamPort n to CCPR1L
movwf CCPR1L
return
;-----------------------------------
counter
decfsz channelSelect, F ;channelSelect--
return
movlw maxVal ;maxVal -> channelSelect
movwf channelSelect

bsf PORTB, switchReset ;resets the 4017
bcf PORTB, switchReset
return
;-----------------------------------
clock ;clocks the 4017
bcf PORTB, switchClock
bsf PORTB, switchClock
return
;-----------------------------------
delay_loop ;~2ms on 4MHZ
MOVLW D'25'
MOVWF 0x50
DEL_LOOP1 MOVLW D'25'
MOVWF 0x51
DEL_LOOP2 DECFSZ 0x51,F
GOTO DEL_LOOP2
DECFSZ 0x50,F
GOTO DEL_LOOP1
return
;--------------------------------------------------------------------
main
call loadChannel ;channel -> actualValue by channelselect
call writePWM ;actualValue to CCPTR1L
bsf PORTB, 2 ;enableSig (see schematic)
call delay_loop ;pause
bcf PORTB, 2 ;enableSig

call counter ;counter + 1 or reset
call clock ;next LED
;-------------------------
goto main
end


leider haut das nicht ganz mit den tabs hin

Das klappt soweit auch, aber der Effekt ist nicht ganz der gewünschte. Die LEDs flackern ein bischen, zwar unterschiedlich hell, aber man kann es nicht den eingestellten Werten zuordnen (Auch die LED mit dem Wert 0 leuchtet)


Wenn man den Code langsamer ausführt (längere pause) dann kann man schon verschiedene Helligkeiten erkennen, aber es soll schließlich ausehen als würde jede LED permanent leuchten

Vielleicht liegt es ja an der PWM Frequenz, dass diese weit über der 4017 Taktfrequenz liegen muss.


Nun ja, jetzt wollte ich euch mal fragen, was ihr davon haltet, ob das so funktionieren kann ob es Software oder Hardware Änderungen geben muss

Bin also dankbar für Beiträge und Kommentare

Gruß
Jörn Arne