-         

Ergebnis 1 bis 1 von 1

Thema: "SwitchPWM" - ?

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    29.01.2006
    Beiträge
    101

    "SwitchPWM" - ?

    Anzeige

    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:


    Code:
    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
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken schematic_189.png  

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •