PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : pwm- steuern Problem



Redals1311
14.07.2008, 13:38
hallo leute

habe ein problem und zwar, erzeuge ich mit dem pic16f877 an ccp1 sprich PORTC,2 eine PWm. Diese Funktioniet auch einbandfrei.
So mein Problem ist, diese PWm ist an einem L&203 enable eingang. Mit diesem baustein kann man dann je nach pwm die motorleistung steuern,. DIe polung der motoren kann man mit dem In1 ode rIn2 beeinflußen.
SO mein problem sit, wenn ich eine Pwm erzeuge und den motor rechtsrum laufen lassen und er soll nach 10 sek in die andere richtung fahren macht er dies nicht.
Kann mir jemand bitte weiterhelfen, wär echt spitze.

hier sit noch der code für eine pwm:
wie müsste ich ihn umstellen das nach einer zeit die räder rückwärtsfahren:




LIST p=16F877 ; list directive to define processor
#include <p16F877.inc>; processor specific variable defs
__CONFIG H'3F39' ; _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC
ERRORLEVEL -302 ; unterdrücke Warnungen zur Bank-Auswahl
ERRORLEVEL -203




;************************************************* *************
;*
;* Pinbelegung
;* ----------------------------------
;* PORTA:
;* 1
;* 2
;* 3
;* 4
;* PORTB:
;* 1
;* 2
;* 3
;* 4
;* 5
;* 6
;* 7
;* PORTC:
;* 1
;* 2 PWM-Ausgang
;* 3
;* 4
;* 5
;* 6
;* 7
;*
;************************************************* *************
;************************************************* *********
Counter1 EQU H'20'
Counter2 EQU H'21'
Counter3 EQU H'22'
Zahl EQU H'23'
Zahl_2 EQU H'24'


; Anfangsinitialisierung

Initialisierung

bsf STATUS,RP0
clrf TRISB
clrf TRISD

bcf STATUS,RP0
clrf PORTC
clrf PORTB
bsf PORTB,5
bcf PORTB,4
clrf Zahl


init
; Vorteiler 16:1 und Timer2 einschalten
BsF T2CON,T2CKPS1 ; Vorteiler 16:1
bcf T2CON,T2CKPS0
BSF T2CON,TMR2ON ; Timer2 ein

; Frequenz auf 10 kHz einstellen
BSF STATUS,RP0 ; Bank1
MOVLW D'90'
MOVWF PR2 ; 2,5 kHz
BCF STATUS,RP0 ; Bank1

; Tastverhältnis auf 50% einstellen
MOVLW D'62' ;62
MOVWF CCPR1L ; 50% von 124

; 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

loop


call Verzögerung_1s
call Verzögerung_1s
call Verzögerung_1s
bcf PORTB,5
bsf PORTB,4
call Verzögerung_1s
call Verzögerung_1s
call Verzögerung_1s
goto loop



#include "Verz\Verz_a.inc"


end

PICture
14.07.2008, 17:03
DIe polung der motoren kann man mit dem In1 ode rIn2 beeinflußen.


Ich habe aber in deinem Code In1 und rIn2 nicht gesehen.

MfG

Redals1311
14.07.2008, 17:20
ja muss ja auch nciht

habe dafür die PINS PORTB,5 und PORTB,4
diese sind ausschlagebend für die Polung

PICture
14.07.2008, 17:43
O.K. :)

Sie müssen aber für die Richtungänderung seine Zustände ändern und das sehe ich in Deinem Code nicht, nur immer PORTB,5=0 und PORTB,4=1.

MfG

Redals1311
14.07.2008, 18:48
doch weiter unten

hier habe ich anderen code sollte aber das gleihe bewirken =)

weißt du du den was ich meine?
hast du nicht noch ideeen?





LIST p=16F877 ; list directive to define processor
#include <p16F877.inc>; processor specific variable defs
__CONFIG H'3F39' ; _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC
ERRORLEVEL -302 ; unterdrücke Warnungen zur Bank-Auswahl
ERRORLEVEL -203




;************************************************* *************
;*
;* Pinbelegung
;* ----------------------------------
;* PORTA:
;* 1
;* 2
;* 3
;* 4
;* PORTB:
;* 1
;* 2
;* 3
;* 4
;* 5
;* 6
;* 7
;* PORTC:
;* 1
;* 2 PWM-Ausgang
;* 3
;* 4
;* 5
;* 6
;* 7
;*
;************************************************* *************
;************************************************* *********
Counter1 EQU H'20'
Counter2 EQU H'21'
Counter3 EQU H'22'
Zahl EQU H'23'
Zahl_2 EQU H'24'
ADW_1 EQU H'25'

; Anfangsinitialisierung

Initialisierung

bsf STATUS,RP0
clrf TRISB
clrf TRISD

bcf STATUS,RP0
clrf PORTC
clrf PORTB
; bsf PORTB,5
; bcf PORTB,4



init
clrf PORTB
bsf PORTB,4

; Vorteiler 16:1 und Timer2 einschalten
BsF T2CON,T2CKPS1 ; Vorteiler 16:1
bcf T2CON,T2CKPS0
BSF T2CON,TMR2ON ; Timer2 ein

; Frequenz auf 10 kHz einstellen
BSF STATUS,RP0 ; Bank1
MOVLW D'90'
MOVWF PR2 ; 2,5 kHz
BCF STATUS,RP0 ; Bank1

; Tastverhältnis auf 50% einstellen
MOVLW D'47' ;62
MOVWF CCPR1L ; 50% von 124

; 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

loop


; ADC-Vorbereitungen:
; ADC speed für (fosc/32) MHz einstellen
bsf ADCON0, 7 ; ADCS1=1
bcf ADCON0, 6 ; ADCS0=0
; ADC einschalten
bsf ADCON0, 0 ; ADON=1


clrf ADW_1
bcf ADCON0, 5
bcf ADCON0, 4
bcf ADCON0, 3
;call Verzögerung_1s
bsf ADCON0, 2

warte_auf_ADW:

btfsc ADCON0, 2
goto warte_auf_ADW
movf ADRESH,W
movwf ADW_1
movlw D'100'
subwf ADW_1,W
btfsc STATUS,C
goto Signal



goto loop

Signal

clrf PORTB
bsf PORTB,5

; Vorteiler 16:1 und Timer2 einschalten
BsF T2CON,T2CKPS1 ; Vorteiler 16:1
bcf T2CON,T2CKPS0
BSF T2CON,TMR2ON ; Timer2 ein

; Frequenz auf 10 kHz einstellen
BSF STATUS,RP0 ; Bank1
MOVLW D'90'
MOVWF PR2 ; 2,5 kHz
BCF STATUS,RP0 ; Bank1

; Tastverhältnis auf 50% einstellen
MOVLW D'62' ;62
MOVWF CCPR1L ; 50% von 124

; 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

loop2


; ADC-Vorbereitungen:
; ADC speed für (fosc/32) MHz einstellen
bsf ADCON0, 7 ; ADCS1=1
bcf ADCON0, 6 ; ADCS0=0
; ADC einschalten
bsf ADCON0, 0 ; ADON=1

clrf ADW_1
bcf ADCON0, 5
bcf ADCON0, 4
bcf ADCON0, 3
;call Verzögerung_1s
bsf ADCON0, 2

warte_auf_ADW2:

btfsc ADCON0, 2
goto warte_auf_ADW
movf ADRESH,W
movwf ADW_1

movlw D'100'
subwf ADW_1,W
btfsc STATUS,C
goto init



goto loop2



#include "Verz\Verz_a.inc"


end

PICture
14.07.2008, 19:41
Bleiben wir, bitte, bei einem Code, sonst bringt es nichts.

Ich habe noch mal dein ersten Code genauer angeschaut. Du initialisierst zwar PORTB,5=1 und PORTB,4=0, aber später läuft das Programm in endloser Schleife "loop" mit PORTB,5=0 und PORTB,4=1. Was soll die Drehrichtung ändern?

MfG

Redals1311
14.07.2008, 19:46
miris gerade aufgefallen,, ich habe den falschen code hoch geladen, und zwar sollte der code bewirken das der motor zuerst rechts rum dreht sprich PORTB,5 = 1 und PORTB,4 = 0

und nach 3 sekunden soll sich die drehrichtung ändern.
PORTB,5 = 0 und PORTB,4 = 1
In diesem fall sollte der Motor links herum laufen.

Mein problem is , wie ich es realisieren kann

PICture
14.07.2008, 20:00
Ganz einfach: so wie bisher mit PORTB,5=1 und PORTB,4=0 initialisieren, mit "call" 3s Verzögerung aufrufen und danach in die endlose Schleife "loop" mit PORTB,5=0 und PORTB,4=1 springen.

MfG

Redals1311
14.07.2008, 20:03
ja so wie ich da oben habe ....

ich habe einen sensor der mir eine spannung ausgibt. Der µC soll die SPannung verarbeiten, wenn ein Hinderniss bzw. Gegensand zu nah am sensor ist, soll der mOtor in die gegen gesetzte richtung fahren.
beide programme oben sind nicht funktionstüchtig

PICture
14.07.2008, 21:08
Der PIC macht alles, aber nur das, was im Programm steht. Versuche, bitte, ein Programmablaufdiagramm zu erstellen. Wie man das macht, steht in "Wiki":

https://www.roboternetz.de/wissen/index.php/PIC_Assembler

In jedem Beitrag schreibst du etwas neues dazu, aber ich bin bisher nicht in der Lage mir dein Problem klar vorzustellen. Ich vermute nur, dass der A/D Wandler soll die Spannung vom Sensor messen und je nach Wert den Motor steuern.

MfG