PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ADC-Wert für PWM



HTLer
24.01.2006, 18:50
Hi Leute!
Ich habe eine 5V variable Eingangsspannung am ADC-Eingang. Diesen variablen Wert will ich einlesen und in das Duty-Cycle-Register für eine PWM schreiben. Muss ich da den Wert noch irgendwie umrechnen oder nicht?

mfg HTLer

stegr
24.01.2006, 19:16
Wenn du PWM und ADC beide auf 10 Bit oder auf 8 Bit hast, dann musste nichts umrechnen.
Wenn dein ADC 10 Bit einliest, musst du die oberen 8 Bit ins DC-Register schreiben.

Prinzipiell musst du aber nichts umrechnen.

MfG
Stefan

BastelWastel
19.02.2006, 06:19
hiho..
hab vor 2 tagen angefangen mich mit pic's zu beschäftigen und wollte das selbe zum adc-test realisieren...
verwendet hab ich einen 16f873 auf einem geäztem testboard...
* porta = adc
* portb = in
* portc = out (8xled)


; Variablen declaration

wait EQU 0x20 ; 'wait' variable für den ADC
adcvalue EQU 0x21 ; Ergebniss des ADC
chansel EQU 0x22 ; ADC Channel für Unterprogramm getana (0-3 auf TestBoard verfügbar)

; Standard Init des TestBoard PIC16F873
Init
bsf STATUS, RP0 ; auf Bank 1 umschalten
movlw B'11111111' ; PortB alle input
movwf TRISB
movlw B'00000000' ; PortC alle output
movwf TRISC
BCF ADCON1, 7
bcf STATUS, RP0 ; auf Bank 0 zurückschalten
bsf ADCON0,0 ; PORTA als analog-in festlegen
bcf ADCON0,3 ; AN0 einstellen
bcf ADCON0,4 ; "
bcf ADCON0,5 ; "
BSF ADCON0, 7 ; ADC Speed
BCF ADCON0, 6 ; "
clrf PORTC ; alle LEDs ausschalten

; Init ende
;************************************************* *************
; Beginn Hauptprogrammschleife

main
btfsc PORTB, 0
call anaout
goto main

; Ende Hauptprogrammschleife
;************************************************* *************
; Beginn Unterprogramme

anaout
clrf chansel
nop
btfsc PORTB, 0
bsf chansel, 0
btfsc PORTB, 1
bsf chansel, 1
nop
call getana
movfw adcvalue
movwf PORTC
return

; Ende Unterprogramme
;************************************************* *************





;***************************************
;* Standard Funktionen für TestBorad *
;***************************************

goto main ; versehentlichen Aufruf verhindern

; Analog Input
getana ; ADC Vorgang starten
btfsc chansel, 0 ; ADC Channel Auswahl - bit3
bsf ADCON0, 3
btfss chansel, 0
bcf ADCON0, 3
btfsc chansel, 1 ; bit4
bsf ADCON0, 4
btfss chansel, 1
bcf ADCON0, 4
btfsc chansel, 2 ; bit5
bsf ADCON0, 5
btfss chansel, 3
bcf ADCON0, 5
nop ; 1Takt Pause
bsf ADCON0, 2 ; ADC starten
adcloop
btfsc ADCON0, 2 ; ist der ADC fertig?
goto adcloop ; nein, weiter warten
movfw ADRESH ; obere 8 Bit des alanogwertes ins arbeitsverzeichnis
movwf adcvalue ; Ergebniss zwischenspeichern
clrf wait ; Warten, damit der ADC sich erholen kann
adcwarten
decfsz wait, f
goto adcwarten
return

end

in chansel (0x22) lege ich den abzufragenden ad kanal fest und speichere das ergebniss (8bit) in adcvalue..
erstmal sry für meinen ghetto-code bin leider selbst anfänger, aber ich hoffe er hat dir geholfen