Thanks for the explanation Henrik.
The more we pound on this and post the results, the better we can get a handle on it.
That concept started to peek through the fog eventually. The fact that my frequency and duty had to be changeable made it a bit more confusing for me.
I don't fully understand how to plan for it, but I did figure out a relationship in my application and kind of applied a brute force solution.
What I ended up with was this:
Code:
'* Working: 1.2Hz to 101Hz, .2% - 97% Duty
'****************************************************************
' 18F1330
' ---------------------u----------------------
' Freq -1|RA0/AN0/INT0 RB3/INT3/CMP1|18- Switch
' Duty -2|RA1/AN1/INT1 RB2/INT2/CMP2|17- Pad
' Pad -3|RA4/TOCKI/AN2 RA7/OSC1/CLKI|16- Pad
' Vpp -4|RA5/MCLR/vpp RA6/OSC2/CLKO/AN3|15- Pad
' Gnd -5|-- VSS VDD++|14- 5 vdc
' Tx -6|RA2/TX/CK RB7/PGD/PWM5|13- PGD
' Rx -7|RA3/RX/DT RB6/PGC/PWM4|12- PGC
' Pad -8|RB0/PWM0 RB5/PWM3|11- Q1/Q4 PWM
' Pad -9|RB1/PWM1 RB4/PWM2|10- Q2/Q3 PWM
' |___________________________________________|
#CONFIG
CONFIG OSC = INTIO2 ;Internal oscillator, port function on RA6 and RA7
#ENDCONFIG
DEFINE OSC 4 ' Actually @ 2MHz
OSCCON = %11011100 ' INTOSC primary, 2MHz
'****** Hardware Serial Setup ***************
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
DEFINE HSER_SPBRG 8 ' 57600 Baud @ 2MHz, -3.55%
SPBRGH = 0
BAUDCON.3 = 1 ' Enable 16 bit baudrate generator
'***************************************
TRISA = %00000011 ' PortA : outputs except RA.0/RA.1= AN
TRISB = %00001000 ' all outputs ex: RB.3 switch i/p
INTCON = 0 '
INTCON2 = 0
CMCON = 0 ' Comparators off
clear
'**** Analog setup ****************************
ADCON1 = %00001100 ' AN0,AN1 Analog: VDD ref. RA4 & RA6 DIO
ADCON2 = %10000000 ' Right justified, 0 Tad, Fosc/2
'***** PWM Setup *******************************
PTCON0 = %00001110 ' 1:1 post, Fosc/256 (1:64) pre, UpDown(...00 free)
PTCON1 = %11000000 ' PWM Time Base timer on, Count Down
PWMCON1 = 1 ' 1:1 postscale, updates enabled, overrides sync
DTCON = 0 ' zero dead-time
PTCON1 = %10000000 ' PWM time base is ON, counts up
FLTCONFIG = 0 ' disable fault A
OVDCONS = %00000000 '
'***** Variable definition **********************
PORTB = 0 ' clear port latch
Fraw var word ' Raw reading for Frequency
Freq var word ' Frequency of PWM
Draw var word ' Raw reading for Duty
Duty Var LONG
Sw var PORTB.3 ' switch input for AC or Positive only
'************************************************
Start:
hserout ["1330_H-bridge85",13,10]
pause 500
'************************************************
Main:
If sw = 0 then ' mode check
PWMCON0 = %00110111 ' 0-3 PWM, independant
OVDCOND = %00001000 ' enable only PWM3 OUT1 (Q1/Q4 on RB5)
else
PWMCON0 = %00110000 ' 0-3 PWM, complementary
endif
ADCON0 = %00000011 ' Start conversion on AN0
WHILE ADCON0.1=1 ' Wait for it to complete
WEND
Fraw.HighByte = ADRESH ' get result from AN0
Fraw.LowByte = ADRESL '
ADCON0 = %00000111 ' Start conversion on AN1
WHILE ADCON0.1=1 ' Wait for it to complete
WEND
Draw.HighByte = ADRESH ' get result from AN1
Draw.LowByte = ADRESL '
Freq = (Fraw *3) max 38 '
draw = draw +1
Duty=((freq*Draw)/261) +1
PTPERH = Freq.highbyte 'load timer: Freq low byte
PTPERL = Freq.lowbyte ' Freq low byte
PDC1H = Duty.HighByte ' PWM duty
PDC1L = Duty.LowByte
hserout ["D",dec duty,"F",dec Freq]
goto Main ' Loop
end
Like I said, I'm going to have to study my own work just to understand it better, but at least it works like it is suppose to. Yay! That was a few weeks of hair pulling!. Beat your head long enough against the wall, and sometimes you find a door.
Thanks
Bo
Bookmarks