Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

PIC 16F876_sterownie PWM. Co należy zmienić w programie?

Roman98 26 Dec 2010 16:11 1425 3
  • #1
    Roman98
    Level 11  
    Ściągnąłem sobie ze strony sprut.de (http://www.sprut.de/electronic/pic/programm/adcpwm.htm) program do zamiany napięcia na PWM na PIC 16F876. Wykorzystuję to do sterowania moja kolejką TT (takie hobby). Zwiększając napięcie od 0V do + 5V na potencjometrze wpiętym między masę a RA0, na wyjściu RC2 zmienia się odpowiednie „wypełnienie” i kolejka jedzie szybciej lub wolniej. Chciałbym to przerobić tak aby między 2,5V a 5V sygnał pojawiał się na na RC2 (przy 5V maksymalne wypełnienie) a od 2,5V do 0V sygnał pojawiał się na wyjściu np. RC1 (przy 0V maksymalne wypełnienie). W ten sposób będę mógł sterować jazdą w przód i w tył tylko jednym potencjometrem. Np. od 2,5V-5V jazda w prawo, a 2,5V-0V jazda w lewo, na środku, czyli około 2,5 V, „wypełnienie” jest minimalne i kolejka stoi.
    Do wyjść RC1 i RC2 przyłącze odpowiednio tranzystory MOSFET.
    Czy ktoś z Szanownych Forumowiczów wie, co w tym programie trzeba zmienić, aby to chodziło tak, jak ja chcę? Jestem początkującym w programowaniu PIC i nie za bardzo wiem, jak sobie z tym poradzić. Za wszelką pomoc dziękuję.
    Stanisław

    ;**************************************************************

    ;*

    ;* Pinbelegung

    ;* ----------------------------------

    ;* PORTA: 0 analoger Eingang

    ;* 1

    ;* 2

    ;* 3

    ;* 4

    ;* PORTB: 0 LED

    ;* 1 LED

    ;* 2 LED

    ;* 3 LED

    ;* 4 LED

    ;* 5 LED

    ;* 6 LED

    ;* 7 LED

    ;* PORTC: 0

    ;* 1

    ;* 2 PWM-Ausgang

    ;* 3

    ;* 4

    ;* 5

    ;* 6

    ;* 7

    ;*

    ;**************************************************************

    ;

    ; sprut (zero) Bredendiek 04/2002

    ;

    ; ADC-Lernbeispiel:

    ;

    ; 16F876 wandelt die an RA0 anliegende Spannung in einen

    ; 10-Bit-Wert um

    ; die oberen 8 Bit des Wertes werden an PortB angezeigt

    ;

    ; 16F876 erzeugt an RC2 ein 2,5 kHz-Signal mit Tastverhältnis

    ; entsprechend der gemessenen Spannung (8-Bit Auflösung)

    ;

    ; Prozessortakt: 20 MHz

    ; Eingangsspannung: 0V ... 5V (Vss ... Vdd)

    ;

    ;**************************************************************

    ; Includedatei für den 16F876 einbinden



    list p=16f876

    #include <P16f876.INC>



    ERRORLEVEL -302 ;SUPPRESS BANK SELECTION MESSAGES



    ;**************************************************************

    ; Configuration festlegen:

    ; Power on Timer, kein Watchdog, HS-Oscillator, kein Brown out, kein LV-programming

    __CONFIG _PWRTE_ON & _WDT_OFF & _HS_OSC & _BODEN_OFF & _LVP_OFF



    ;**********************************************************



    ; Variablen

    wait EQU 0x20



    ; Anfangsinitialisierung



    init

    ; PWM vorbereiten

    ; Vorteiler 16:1 und Timer2 einschalten

    BSF T2CON,T2CKPS1 ; Vorteiler 16:1

    BSF T2CON,TMR2ON ; Timer2 ein



    ; Frequenz auf 1,22 kHz einstellen

    BSF STATUS,RP0 ; Bank1



    MOVLW D'255' ;

    MOVWF PR2 ; 1.22 kHz

    BCF STATUS,RP0 ; Bank1



    ; Tastverhältnis auf 50% einstellen

    MOVLW D'127' ;

    MOVWF CCPR1L ; 50%



    ; RC2/CCP1 auf Ausgang stellen

    BSF STATUS,RP0 ; Bank1

    BCF TRISC, 2 ; RC2: output=0

    BCF STATUS,RP0 ; Bank 0



    ; PWM MODE mit CCP1 initialisieren

    CLRF CCP1CON ; CCP1-Modus aus

    BSF CCP1CON,CCP1M3 ; CCP1-Modus PWM-Mode

    BSF CCP1CON,CCP1M2 ;



    ; ADC vorbereiten

    ; PortB vorbereiten

    bsf STATUS, RP0 ; auf Bank 1 umschalten

    movlw B'00000000' ; PortB alle output

    movwf TRISB

    bcf STATUS, RP0 ; auf Bank 0 zurückschalten

    clrf PORTB ; alle LEDs ausschalten



    ; ADC einschalten

    BSF ADCON0, 0 ; ADON=1



    ; ADC-Eingang AN0 auswählen

    BCF ADCON0, 5 ; ADCHS2=0

    BCF ADCON0, 4 ; ADCHS1=0

    BCF ADCON0, 3 ; ADCHS0=0



    ; ADC speed für 20 MHz einstellen

    BSF ADCON0, 7 ; ADCS1=1

    BCF ADCON0, 6 ; ADCS0=0



    ; Daten linksbündig

    BSF STATUS,RP0 ; Bank1

    BCF ADCON1, 7 ; ADFM=0

    BCF STATUS,RP0 ; Bank0





    ;**********************************************************

    ; Hauptprogrammschleife



    Main

    ;Eingangsspannung wandeln

    BSF ADCON0, 2 ; ADC starten

    loop

    BTFSC ADCON0, 2 ; ist der ADC fertig?

    GOTO loop ; nein, weiter warten



    ; Wert nach PortB schreiben

    movfw ADRESH ; obere 8 Bit auslesen

    movwf PORTB ; obere 8 Bit nach PortB



    ; Wert an PWM übergeben

    MOVWF CCPR1L ; obere 8 Bit sind PWM



    ; Warten, damit der ADC sich erholen kann

    clrf wait

    warten

    DECFSZ wait, f

    goto warten



    goto Main



    end



    ;****
  • Helpful post
    #3
    adamwesola
    Level 24  
    "co w tym programie trzeba zmienić, aby to chodziło tak, jak ja chcę?" - prawie wszystko, zamiast radzić co zmienic, latwiej bylo mi samemu dokonać tych zmian, zapoznaj sie z programem z datasheetem w ręku, a będzie wiedział.
    Wprowadziłem cztery wartosci reprezentujące srodkowe polożenie potencjometru, przy dwóch trudniej byloby uzystać wyłączenie silniczkow (brak sygnałół pwm na rc1 i rc2
  • #4
    Roman98
    Level 11  
    jestem ogromnie wdzięczny za program. Widać, że jesteś fachowcem w tej sprawie. Zrobię z niego .hex i wypróbuję. DZIĘKI!!!