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:
leider haut das nicht ganz mit den tabs hinCode: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
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
Lesezeichen