here is the gist of the code im running:
@ device pic12f683,INTRC_OSC_NOCLKOUT , wdt_on, mclr_off, protect_off
DEFINE OSC 4
DEFINE ADC_BITS 10
DEFINE ADC_SAMPLEUS 50
ANSEL = %00000010 ' GPIO.1 A/D in, rest digital
TRISIO = %00010010 ' GPIO.1 lectura AD,
cmcon0 = %00000100 ' AD via gpio1 and internal reference
vrcon = %10001010 ' set vref=2.25v
.
.
.
loop:
oldpote=pote
ADCIN 1, pote ' (0-65535)
if oldpote <> pote then
hpwm 1,inverduty,frecu 'these values are calculated in other section
endif
goto loop
maybe the problem is that im using ADC and HPWM simultaneously?
I don't undertand what you implied by reading that section of the DS.
Thanks!
Last edited by peu; - 6th May 2007 at 00:04.
That's just his little way of saying "I don't Know, go read the datasheet or something."<hr>
When an HPWM command executes, it treats it like it's the First time, and sets up every register needed to run PWM with the CCP module.
Changing CCP and TMR2 registers while the CCP is running PWM will cause "false pulses", Cycle Resets or elongation.
It would be nice if there was an HPWM_UPDATE command that only changed the dutycycle, without messing with the other registers. But there isn't.
If you need a totally "Glitch Free" PWM signal, then you'll have to modify the dutycycle manually. You can still use HPWM to set everything up. And then just modify the dutycycle later, after the PWM is running.
If you haven't already, you should get a copy of mister_e's PicMultiCalc.exe
It'll help figure out what values to use for the dutycycles.
http://www.mister-e.org/pages/utilitiespag.html
HTH,
DT
Thanks for the reply Darrel, now that explains many things
After many tries I managed to make the mister-e app work, it gave me an unregistered class error, but after a little googling I solved, it.
baaaack to the protoboard!
well, now I have a new difficulty, trying to understand the calculator
Running OSC at 4mhz and PWM at 1khz I get:
And I found a post where Mister_e explains how to use it:
If I understand correctly what you posted, I can start the HPWM before the main loop by using for example: HPMW 0,0,1000 and then within the loop adjust just the dutycycle.Code:' ' 38KHz PWM @ 4MHZ using a PIC16F877 ' ---------------------------------- @ __CONFIG _XT_OSC & _LVP_OFF ' ' TRISC = 0 Duty var byte ' ' PWM SETUP ' ========= ' PicMultiCalc says.. ' Duty value for 50%=52 ' PR2 = 25 ' PRESCALLER 1:1 ' ' duty = 52 ' duty value for 50% duty cycle PR2 = 25 ' T2CON = %00000100 ' timer2 on, prescale 1:1 CCPR1L = duty>>2 ' MSB of duty cycle value CCP1CON=%00001100 | (dUTY<<5) ' set PWM mode and store the ' 2 LSB of duty SpinInRound: goto spininround
Now what I dont understand is how I change the duty cycle, by using the calc I get 1000 values, but the duty variable is defined as BYTE
I could use some help/hint
Thanks!
well it seems Im having a conversation with myself, instead of busting the few neurones I have left, I used the second option (prescaler 1:16) and I made it work, but the glitches are still there.
I initialized the PMW before the main loop using: HPWM 0,0,1000
and the registers as:
T2CON = %00000110 ' timer2 on, prescale 1:16
PR2 = 62 'per pic calculator
and every time I wanted to adjust the duty cycle I entered the value in the duty variable and called this subroutine:
CCPR1L = duty>>2
CCP1CON=%00001100 | (duty<<5)
As I said...the glitches remain... if I stop reading the ADC they dissapear and the PWM is steady
HELP !
first you'll have to match the calc values to suit your need. With your current code example (which seems to be one of mine, the calc will give you...
<IMG SRC="http://www.picbasic.co.uk/forum/attachment.php?attachmentid=1593&stc=1&d=117840872 7">
look at this section of the code
52 is showned in the result section and it's to set the duty cycle to 50% as selected in the duty cyle section.Code:duty = 52 ' duty value for 50% duty cycle PR2 = 25 ' T2CON = %00000100 ' timer2 on, prescale 1:1 CCPR1L = duty>>2 ' MSB of duty cycle value CCP1CON=%00001100 | (dUTY<<5) ' set PWM mode and store the ' 2 LSB of duty
Now if you want to update the duty cycle, you could use this section
in your code you just need to change the value of Duty variable.Code:CCPR1L = duty>>2 ' MSB of duty cycle value CCP1CON=%00001100 | (dUTY<<5) ' set PWM mode and store the ' 2 LSB of duty
The example was for a 16F877, you should have a look at the 12F683 to see if they work the same way.
post your whole code, maybe some register need to be set in a different way. I'll put some effort and open my datasheet as well![]()
Last edited by mister_e; - 6th May 2007 at 01:52.
Steve
It's not a bug, it's a random feature.
There's no problem, only learning opportunities.
it seems we posted at the same time, yes the post I used is from an old post of yours I used for reference. Please read my last post and tell if if you have an idea that may help me. Thanks!
Hi, Darrel ,
I do not know if you're right here ...
The fact is I used HPWM without pain for years ... but NOT aboard any '683
and it REALLY seems there's a HARDWARE ( say CCP functionning ) issue.
The µChip section Skimask pointed at shows " PMW module *might* be disabled before changing the dutycycle ". I read some Other Pics Datasheets and this GREY section didn't appear elsewhere ...
IF I'm right, this "funny feature" happens whatever you use, assembler or Basic (!) ... The way HPWM command works doesn't matter here !!!
So, a ( Which other Basic do you think to ??? .... mmmmmh ? ) HPWM_UPDATE command wouldn't solve the question !!!
µChip clearly says : Changing the dutycycle while PWM running (and only dutycycle is enough ) will produce unwanted effects ...
The only way I see to keep ( is it really necessary ??? Good Q.) a "neat" PWM output would be to switch between HPWM, to the last produced fixed freq. and duty, soft PWM ... while disabling CCP, changing Dutycycle and re-enabling the CCP.
Quite a funny little sub to write, no ???
Back to our Friend Skimask ... I really do not know ... if he really doesn't know the "what is wrong".
I'm Ok ... this is not giving the solution, nor ... BUT ... His first answer could have been " Won't work with the '683 ( FINAL POINT )"
Would be kind to leave guns, knives, scissors and umbrellas out before entering the saloon ... just a thought.
Alain
Last edited by Acetronics2; - 6th May 2007 at 10:57.
************************************************** ***********************
Why insist on using 32 Bits when you're not even able to deal with the first 8 ones ??? ehhhhhh ...
************************************************** ***********************
IF there is the word "Problem" in your question ...
certainly the answer is " RTFM " or " RTFDataSheet " !!!
*****************************************
Here is a snippet of code from a motor speed controller for a small electric cart. The HPWM command is constantly repeated and has never caused any problems. In fact, in the beginning, I took the value of the speedpot once and just let the motor run and it caused problems. Intermittently the motor would "jump" into full speed. In spite of double regulation and a lot of filtering, motor noise sometimes caused the HPWM to go OUTPUT HIGH. I know it was motor noise because it never happened when controlling a 12V lamp.
ON:
ADCIN 2, SPEEDPOT 'READ VALUE OF SPEED CONTROL POT
IF SPEEDPOT > 150 Then LET SPEEDPOT = 150 'LIMIT SPEED OF MOTOR
IF LEFTRAMP < SPEEDPOT Then LET LEFTRAMP = LEFTRAMP + 1 'INCREASE SPEED SLOWLY
IF LEFTRAMP > SPEEDPOT Then LET LEFTRAMP = LEFTRAMP - 1 'DECREASE SPEED SLOWLY
Pause 1 'CONTROLS RATE OF SPEED INCREASE/DECREASE
HPwm 1,LEFTRAMP,10000 'OUTPUTS THE DUTYCYCLE CONTROLLED BY SPEEDPOT
IF PORTB.5 = 1 Then ON 'SWITCH PUSHED KEEP MOTOR RUNNING
GOTO START 'STOP EVERYTHING
The circuit Im using controls the feedback node of a switcher which its used to drive a power LED, any small glitch in the duty cycle is "visible" in the light output.
What puzzles me is the minute I stop using the ADCIN command, all the problems dissapear:
if calibrapin=0 then
ADCIN 1, pote
endif
if I put this calibrapin to 1 the output is steady. When it was bedtime yesterday (yes I keep thinking about problems in bed), I tought: why not use software PWM, that may solve this issue. Well seeing it was suggested here too, makes me want to try it and I will
Regarding the DS section 11.3.3: "The PWM module may generate a premature pulse when changing the duty cycle."
Its the MAY word that puzzles me, I would expect more certainty here.
I still need to test Mister E suggestion, and speaking of it:
In fact Im using the internal comparator, thats why I didnt disable it, if you check my 1st code post you will see:mm, you didn't disable the analog comparator.. maybe it worth to do it first?
vrcon = %10001010 ' set vref=2.25v
I need to put this value there so I can get more samples from my limited range sensor.
Also I tough it may be simply a reading problem, but this wasnt the case, I filled the available eeprom space with the read values and they were steady.
THANKS for the help guys! Back to the protoboard!
Pablo
And I just downloaded the latest/greatest 12F683 datasheet and it DOESN'T have that statement in there. What's up with that?
Couldn't you update the duty cycle right after T2 has overflowed? As long as the duty cycle wasn't too low or too high, wouldn't this almost eliminate all false glitches?µChip clearly says : Changing the dutycycle while PWM running (and only dutycycle is enough ) will produce unwanted effects ...
The only way I see to keep ( is it really necessary ??? Good Q.) a "neat" PWM output would be to switch between HPWM, to the last produced fixed freq. and duty, soft PWM ... while disabling CCP, changing Dutycycle and re-enabling the CCP.
I got a good handle on "what's wrong" 'cause I ran into the same problem with my multi-channel software PWM program I wrote to run a bunch of lights awhile back. And my fix for the problem was to only update the PWM duty cycle for each channel in between cycles, so basically, I ended up with PWM that couldn't do 100% duty cycle, but only about 0%-95% duty cycle. The extra 5% at the top end was used to update the software registers.Back to our Friend Skimask ... I really do not know ... if he really doesn't know the "what is wrong".
Hi, Skimask
Q1) Here is an excerpt ( joined ) ... Peu found it also ... If not in the latest datasheets, might we think the new devices have been modified ???
Q2) I must experiment ... T2 overflow is to try ... Honestly, I would use a SMD 16F628,648,88 or ??, instead, if size is a really a problem ( LOL !!! )
R3) It's the most logical solution ...
Regards
Alain
************************************************** ***********************
Why insist on using 32 Bits when you're not even able to deal with the first 8 ones ??? ehhhhhh ...
************************************************** ***********************
IF there is the word "Problem" in your question ...
certainly the answer is " RTFM " or " RTFDataSheet " !!!
*****************************************
Its indeed modified...!! I just redownloaded the datasheet and the PWM section is more complete now.
check both versions here: http://peu.net/temp/pic12f683_OLD_vs_NEW.zip
Well, in my case I have very low space, all my pcb is a 18mm diameter board...Q2) I must experiment ... T2 overflow is to try ... Honestly, I would use a SMD 16F628,648,88 or ??, instead, if size is a really a problem ( LOL !!! )
Here is my code, I tidied / commented it so its more readable: http://peu.net/temp/pwm-adc
Thanks!
Bookmarks