PWM utsignal beroende på Analog insignal (PIC16F690)
PWM utsignal beroende på Analog insignal (PIC16F690)
Hej!
Jag och en grupp håller på utveckla en elcykelprototyp och är nu fullt igång med att konstruera motorstyrningskretsen.
För att styra motoreffekten tänkte jag använda mig av PWM-reglering. Någon form av potentiometer (gasreglage, trådtöjningsgivare el lik) skall skapa en spänning. Denna spänning kopplas till en analog ingång till en uC. För detta ändamål tänkte jag använda mig av ELFA's PIC 2 starter Kit, det verkar prisvärt.
Här är en skiss på min idé: https://www.dropbox.com/gallery/1968407/1/Test?h=7cb605
Jag har läst datablad och försökt förstå mig på de 12 'lessons' som följde med vid köpet. Jag förstår dessa någonlunda och har tidigare läst lite digital och datorteknik, men det är ändå en hel del som är oklart.
Tänkte att jag inte behövde uppfinna hjulet igen, och mycket riktigt hittade jag andra som redan har försökt sig på samma sak, exempelvis;
http://www.electro-tech-online.com/elec ... input.html
Den kod som används är kod tagen från länken ovan och är modifierad till:
http://www.mediafire.com/?vqnnjzvw1wk
Jag gjorde några småkorrigeringar i programmet för att försöka anpassa den till 16F690, men den läser fortfarande inte av den analoga ingången rätt. Skulle vara mycket tacksam för lite hjälp med detta!
EDIT: Värt att påpeka är att denna variant använder en mjukvarubaserad PWM reglering. PIC16F690 har ju en inbyggt PWM register som vore mycket smidigare att använda..
MVH
Oscar
Jag och en grupp håller på utveckla en elcykelprototyp och är nu fullt igång med att konstruera motorstyrningskretsen.
För att styra motoreffekten tänkte jag använda mig av PWM-reglering. Någon form av potentiometer (gasreglage, trådtöjningsgivare el lik) skall skapa en spänning. Denna spänning kopplas till en analog ingång till en uC. För detta ändamål tänkte jag använda mig av ELFA's PIC 2 starter Kit, det verkar prisvärt.
Här är en skiss på min idé: https://www.dropbox.com/gallery/1968407/1/Test?h=7cb605
Jag har läst datablad och försökt förstå mig på de 12 'lessons' som följde med vid köpet. Jag förstår dessa någonlunda och har tidigare läst lite digital och datorteknik, men det är ändå en hel del som är oklart.
Tänkte att jag inte behövde uppfinna hjulet igen, och mycket riktigt hittade jag andra som redan har försökt sig på samma sak, exempelvis;
http://www.electro-tech-online.com/elec ... input.html
Den kod som används är kod tagen från länken ovan och är modifierad till:
http://www.mediafire.com/?vqnnjzvw1wk
Jag gjorde några småkorrigeringar i programmet för att försöka anpassa den till 16F690, men den läser fortfarande inte av den analoga ingången rätt. Skulle vara mycket tacksam för lite hjälp med detta!
EDIT: Värt att påpeka är att denna variant använder en mjukvarubaserad PWM reglering. PIC16F690 har ju en inbyggt PWM register som vore mycket smidigare att använda..
MVH
Oscar
Re: PWM utsignal beroende på Analog insignal (PIC16F690)
Visa koden sm du testar med så får vi se.
Annars så har väl ADC kapitlet i databladet vad som behövs...
Annars så har väl ADC kapitlet i databladet vad som behövs...
-
- EF Sponsor
- Inlägg: 544
- Blev medlem: 8 december 2006, 11:18:14
- Ort: Tågarp, Svalöv
Re: PWM utsignal beroende på Analog insignal (PIC16F690)
Om du bara ska omvandla analog spänning till PWM så är microcontroller onödig när du bara behöver en triangelvåg och en komparator.
//A
//A
Re: PWM utsignal beroende på Analog insignal (PIC16F690)
> PIC16F690 har ju en inbyggt PWM register som vore mycket smidigare att använda..
Vad hindrar dig/er att göra det då ?
Men nu var det väl avläsningen av ADC'n som strulade.
Visa lite kod över hur ni gör så får vi se. (Och nej, jag tänker inte strula
runt på någon obskyr site bara för det, det är ju inte jag som har problem...)
Vad hindrar dig/er att göra det då ?
Men nu var det väl avläsningen av ADC'n som strulade.
Visa lite kod över hur ni gör så får vi se. (Och nej, jag tänker inte strula
runt på någon obskyr site bara för det, det är ju inte jag som har problem...)
Re: PWM utsignal beroende på Analog insignal (PIC16F690)
Från länken
Kod: Markera allt
;**********************************************************************
; This file is a basic code template for assembly code generation *
; on the PIC16F690. This file contains the basic code *
; building blocks to build upon. *
; *
; Refer to the MPASM User's Guide for additional information on *
; features of the assembler (Document DS33014). *
; *
; Refer to the respective PIC data sheet for additional *
; information on the instruction set. *
; *
;**********************************************************************
; *
; Filename: xxx.asm *
; Date: *
; File Version: *
; *
; Author: *
; Company: *
; *
; *
;**********************************************************************
; *
; Files Required: P16F690.INC *
; *
;**********************************************************************
; *
; Notes: *
; *
;**********************************************************************
list p=16f690 ; list directive to define processor
#include <P16F690.inc> ; processor specific variable definitions
__CONFIG _CP_OFF & _CPD_OFF & _BOR_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _MCLRE_ON & _FCMEN_OFF & _IESO_OFF
; '__CONFIG' directive is used to embed configuration data within .asm file.
; The labels following the directive are located in the respective .inc file.
; See respective data sheet for additional information on configuration word.
;***** VARIABLE DEFINITIONS
w_temp EQU 0x7D ; variable used for context saving
status_temp EQU 0x7E ; variable used for context saving
pclath_temp EQU 0x7F ; variable used for context saving
;**********************************************************************
ORG 0x000 ; processor reset vector
goto main ; go to beginning of program
ORG 0x004 ; interrupt vector location
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp ; save off contents of STATUS register
movf PCLATH,w ; move pclath register into W register
movwf pclath_temp ; save off contents of PCLATH register
; isr code can go here or be located as a call subroutine elsewhere
movf pclath_temp,w ; retrieve copy of PCLATH register
movwf PCLATH ; restore pre-isr PCLATH register contents
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
main
;###############################################################################
; Title: ADC, Servo Demo
; Author: Mike Webb
; Date: 21 Nov 2006
;################################################################################
errorlevel -302 ; stop the annoying " Register in operand not in bank 0." error.
; Setup Variables
cblock 0x20
Count
OnTime
endc
nop ; required for ICD2
bcf STATUS,RP1; bank 0 or 2
bsf STATUS,RP0; select bank 1
movlw (0<<NOT_RABPU|0<<INTEDG|0<<T0CS|0<<T0SE|0<<PSA|B'000'<<PS0)
movwf OPTION_REG; setup option reg
movwf TRISA; EGEN KOD HÄR, KAN VARA FEL!
movlw 0xFF
movwf ANSEL
movlw 0x01
movwf ADCON0; EGEN KOD SLUT
bcf TRISC,0 ; make b0 output
movlw B'111'<<IRCF0; =b'01110000'
movwf OSCCON; select 8MHz clock
movlw b'00001000'; Select bit 3
movwf ANSEL; ADC on RA3
bcf STATUS,RP0; back to bank 0
Loop Call ReadADC; read A3
movwf OnTime; Store it for later
movlw d'250'; 250*8 = 2000 cycles = 1mS
bsf PORTC,0; Turn output on
call DelayW; delay the 1mS
movfw OnTime; Get value from ADC
btfss STATUS,Z; if it's zero don't do any delay
call DelayW; delay W*8 = 0 to 255 = 0 to 1.03 mS -- near enough
bcf PORTC,0; Turn output off - pulse is complete
comf OnTime,W; Complement ADC value
addlw 1; com and inc = negate.
btfsc STATUS,Z; Don't do a delay of zero
call DelayW; delay (256-ADC value)*8 = time required to get to 2mS
movlw d'18'; We need to delay another 18mS
movwf Count; so setup a counter
TimeLoop movlw d'250'; 250*8 = 2000 clock cycles = 1mS
call DelayW; do the delay
decfsz Count,F; repeat it?
goto TimeLoop; yes, go around again
goto Loop; Go back and do it all again
DelayW
; will delay W*8 cycles including the call/return
addlw 0xff; add -1 to W 1
btfsc STATUS,Z; =zero? 1/2
goto DoneDelay; yes, better get out of here 2
nop ; delay a bit 1
goto $+1; delay a bit more 2
goto DelayW; go around again 2
DoneDelay return ; 2
ReadADC movlw b'01'<<ADCS0|b'011'<<CHS0|b'0'<<GO|b'1'<<ADON
movwf ADCON0; select pin A3 and 16 TOSC
bsf STATUS,RP0; bank 1
movlw b'0'<<ADFM|b'1'<<ADCS2|b'00'<<VCFG
movwf ADCON1; Left justify
bcf STATUS,RP0; back to bank 0
movlw 5; wait 5*8 = 40 cycles
call DelayW; for ADC capacitor to charge
bsf ADCON0,GO; Start the conversion
WaitADC btfsc ADCON0,GO; Conversion complete?
goto WaitADC; No, so keep waiting
movfw ADRESH; return with result in W
return
END
; remaining code goes here
ORG 0x2100 ; data EEPROM location
DE 1,2,3,4 ; define first four EEPROM locations as 1, 2, 3, and 4
END ; directive 'end of program'
Re: PWM utsignal beroende på Analog insignal (PIC16F690)
Är "ReadADC" kontrollerad/justerad för att fungera på 16F690 ?
Re: PWM utsignal beroende på Analog insignal (PIC16F690)
Ursäkta för ett otroligt sent svar och dålig uppdatering.
Vi skippade assembler och gick helt över till C och kompilatorn mikro-C. Denna kompilator hade inbyggda funktioner (lite fusk kanske?
) där man kunde läsa av den analoga pinnen med ett kort kommando: int temp1=ADC_read(0);
La även märke till att transienterna på PWM signalen med 16F690 var lite större än 16F886. Eftersom båda var tillgänliga gick vi över till 886'an. Det kommer bli mer programmering framöver, så jag ska försöka hålla tråden levande och leverera lite uppdateringar.
Tack för era tips och lösningsförslag.
Mvh
/Oscar
Vi skippade assembler och gick helt över till C och kompilatorn mikro-C. Denna kompilator hade inbyggda funktioner (lite fusk kanske?

La även märke till att transienterna på PWM signalen med 16F690 var lite större än 16F886. Eftersom båda var tillgänliga gick vi över till 886'an. Det kommer bli mer programmering framöver, så jag ska försöka hålla tråden levande och leverera lite uppdateringar.
Tack för era tips och lösningsförslag.
Mvh
/Oscar
Re: PWM utsignal beroende på Analog insignal (PIC16F690)
>La även märke till att transienterna på PWM signalen med 16F690 var lite större än 16F886
Vad betyder det här?
Vad betyder det här?
Re: PWM utsignal beroende på Analog insignal (PIC16F690)
Vid PWM'ens övergångar mellan 0v och +5V blev det små transienter med 16F690.
/Oscar
/Oscar
-
- Inlägg: 2436
- Blev medlem: 28 januari 2007, 18:45:40
- Ort: Kungsbacka
Re: PWM utsignal beroende på Analog insignal (PIC16F690)
Har ni monterat på en transistor på PWM utgången på PIC16F690 kretsen när ni mätte upp era transienter? Och i så fall hur? Det kan vara den som spökar och leder tillbaka något som ger era mätningar. Utgången ska nämligen inte ge några transienter att tala om... om man kopplar rätt dvs.
Re: PWM utsignal beroende på Analog insignal (PIC16F690)
> Vid PWM'ens övergångar mellan 0v och +5V blev det små transienter med 16F690.
Var ? På PWM signalen ? Eller på matningsspänningen ?
Var ? På PWM signalen ? Eller på matningsspänningen ?
Re: PWM utsignal beroende på Analog insignal (PIC16F690)
Vi har gått från 16F690 till 16F886 och problemen försvann. Vet inte vad felet berodde på men det är inte av prioritet just nu.
För att klara lagkraven måste cykelassistansen sluta vid aktuell hastighet > 25 km/h. För att göra detta har vi satt på en skiva med magneter och en sensor, se : https://www.dropbox.com/gallery/1968407/1/Test?h=7cb605
För att få en hyffsad bra upplösning har vi 5 magneter på ett varv.
För att lösa detta i mikro-C tänkte vi använda oss av positiva flanker. Jag har gjort en skiss på pseudokoden på denna bild, se "Hastighetsmätning" : https://www.dropbox.com/gallery/1968407/1/Test?h=7cb605
"Hastighetmätning" är en del av huvudprogrammet, vars pseudokod även finns uppe på samma länk.
Jag vet inte hur man programmerar så att tex RB0 reagerar på positiva flanker? Har gått igenom jälpkatalogen och sökt en del i forumet men hittar ingen vettig programrad
Är tacksam för hjälp!
/Oscar
För att klara lagkraven måste cykelassistansen sluta vid aktuell hastighet > 25 km/h. För att göra detta har vi satt på en skiva med magneter och en sensor, se : https://www.dropbox.com/gallery/1968407/1/Test?h=7cb605
För att få en hyffsad bra upplösning har vi 5 magneter på ett varv.
För att lösa detta i mikro-C tänkte vi använda oss av positiva flanker. Jag har gjort en skiss på pseudokoden på denna bild, se "Hastighetsmätning" : https://www.dropbox.com/gallery/1968407/1/Test?h=7cb605
"Hastighetmätning" är en del av huvudprogrammet, vars pseudokod även finns uppe på samma länk.
Jag vet inte hur man programmerar så att tex RB0 reagerar på positiva flanker? Har gått igenom jälpkatalogen och sökt en del i forumet men hittar ingen vettig programrad

Är tacksam för hjälp!
/Oscar
Re: PWM utsignal beroende på Analog insignal (PIC16F690)
Det du söker finns att läsa om i databladet eller på nätet och brukar kallas "interrupt on change".
Re: PWM utsignal beroende på Analog insignal (PIC16F690)
> Jag vet inte hur man programmerar så att tex RB0 reagerar på positiva flanker?
> Har gått igenom jälpkatalogen och sökt en del i forumet men hittar ingen vettig programrad
Jag vet vilken hjälpkatalog du talar om, men jag vet
att databladet är solklart på den punkten. Hittade
det direkt, exakt på förväntat ställe, i kapitlet om
interrupt...
> Har gått igenom jälpkatalogen och sökt en del i forumet men hittar ingen vettig programrad
Jag vet vilken hjälpkatalog du talar om, men jag vet
att databladet är solklart på den punkten. Hittade
det direkt, exakt på förväntat ställe, i kapitlet om
interrupt...
Re: PWM utsignal beroende på Analog insignal (PIC16F690)
Jag skulle använt capture-funktionen i CCP-enheten.