PDA

View Full Version : 12f683 variable HPWM and fixed pulse tick thickness



RCtech
- 19th February 2015, 20:57
Hello.

I'm pretty sure someone already post something like I need.
I did a very simple program to sweep a frequency from 900Hz to 12KHz (Code below)
But, I need my pulse thickness to be fixed at 5µs everytime.

With my code, I use duty in percentage so the thickness of the pulse change everytime.
It's okay only when frequency reach 2KHz but it's too long before and too short after because I didn't took the right way to setup my HPM.
Yes, I know my mistake and I know too I don't have enough knowledge about Timers I'm not very familiar with.
Then, I'm stupidly looking for an example with "fixed pulse thickness".

I did some search with many keywords but I didn't found what I need.

Could someone give me a way to follow ?
(And sorry for my bad English).


@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF & _CP_OFF & _BOD_OFF

TRISIO = %000001
OSCCON = %01110000 ' 8Mhz
ANSEL = %001011 ' AN0 and AN1 and AN3 ANALOG
ADCON0.7 = 1 ' Right justify result (Pour l'ADCin)
CMCON0 = 7 ' Analog comparators off (Pour l'ADCin)

'-------------------------------------------------------------------------------

FREQmax VAR WORD
FREQmax = 12000
FREQmin VAR WORD
FREQmin = 900
HPWMfreq VAR WORD
HPWMfreq = FREQmin
HPWMduty VAR WORD
HPWMduty = 3 ' 1% = 3 à 100% = 254

'-------------------------------------------------------------------------------

Up VAR BIT
Up = 1

GPIO = 0

;----[Main Program Loop]--------------------------------------------------------
MAIN:

HPWM 1, HPWMduty, HPWMfreq ' Start HPWM

PAUSE 10 ' 10mS between each steps

IF Up = 1 and HPWMfreq <= FREQmax THEN 'Going UP from 900 to 12KHz
HPWMfreq = HPWMfreq + 1

Else ' Here we are at freq maxi
Up = 0

ENDIF

IF Up = 0 and HPWMfreq >= FREQmin THEN 'Going DOWN from 12K to 900Hz
HPWMfreq = HPWMfreq - 1
Else ' Here we are at freq mini
Up = 1
ENDIF

IF HPWMfreq = FREQmin THEN
Boucle = Boucle + 1
Toggle LED
ENDIF

GOTO Main

'-------------------------------------------------------------------------------


FIN:
END

RCtech
- 20th February 2015, 01:11
For those who could need it, i've just found (thanx to Excel) a basic mathematical solution by adding this simple calc :

HPWMduty = (500/(1/HPWMfreq*10000))*254/10000 to recalculate each cycles the new duty.
Not tested but it should be okay.
Resolution could probably be better by another way...

Acetronics2
- 20th February 2015, 08:16
Hi,

With the internal osc , even @ 8Mhz, HPWM definitly is not what to use ... so is pure basic ...

with 10ms steps ... you'd better use PAUSEUS to generate the pulse ( need 16 Mhz ext osc ! ... or 8 asm NOP's @ 8Mhz ), and a timer to generate an interrupt every 10 ms that will change the pause beetween pulses ...

see Darrel's Instant Interrupts for easy interrupts ...

May be also a very very smart solution with the COMPARE mode of the CCP that can change the CCP outpin and set the CCPIF just when pause ends ...

Alain

mark_s
- 20th February 2015, 17:31
One of many possible approaches. Here the way I have done this.

First I generated my adjustable frequency using HPWM set to approximately 50% duty. Next I fed the output from CCP1 pin
to Portb.0 pin. Using DT interupts "INT_INT" set to trigger on the rising edge of my pwm signal. In the ISR the output pin was toggled

Basic concept


Setup HPWM
Set INTCON to trigger on rising edge
Main:
Read Buttons or ADC
Set HPWM Frequency
Goto main


Interupt Service Routine:
gpio.x = 1
pauseus 5
gpio.x = 0
INT_RETURN


Not sure if you have enough pins using a 12f683 to do this and what ever else you need?

RCtech
- 2nd March 2015, 16:54
Thanx a little bit late for your both replies.
Not as easy as I expected, I'll have to learn more and will start seeing Darrel's Instant Interrupts.

... and will be back again if I need help with these interrupts.

Thank you.