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:
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.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
Thanks
Bo





Bookmarks