So you are using the encoders for speed calc instead of distance . . . have you tried using comparators to shape the pulses for you?
So you are using the encoders for speed calc instead of distance . . . have you tried using comparators to shape the pulses for you?
Last edited by Archangel; - 25th December 2013 at 04:46.
If you do not believe in MAGIC, Consider how currency has value simply by printing it, and is then traded for real assets.
.
Gold is the money of kings, silver is the money of gentlemen, barter is the money of peasants - but debt is the money of slaves
.
There simply is no "Happy Spam" If you do it you will disappear from this forum.
Hi Arhangel. Thanks for the reply. Maybe you might be right. the encoders that I have put out very good defined square wave pulses at 55 pules an inch. I expect my maximum travel speed to be 2 inches per second. As I accelerate the PWM output should increase smoothly and it isn't. I am not sure how using comparators would help me? Other people I've talked to have suggested using linear encoders i.e 0 to 5 volts out with increase in speed and feeding the output into the A to D convertors. Just anothe Idea for me to try. Thanks
Hi,
I Think it's just a matter of time, so to speak....
If your top speed is 2"/sec I'm going to guess that a typical slow speed is something like 0.05"/sec. At that speed, with 55 pulses per inch, the signals period time is 1/(55*0.05)=363ms, then you're doing that on two "channels" (no, they are not measuring the two pulses simultanously).
There's really not much the software can do about that, it can't update the output of it doesn't get any input and the input is only updated ~1.5 times per second at such slow speed.
Using tachometers is better since they are continous output devices but you may need some preamplifier to boost the output voltage at slow speed - it all depends. And you're going to need a precision rectifier or an external ADC that can measure both positve and negative voltages since the polarity of the output changes with direction of rotation. Changing to higher resolution encoder is another option.
/Henrik.
Hi Henrik
Thanks for the feedback. I started this project a number of months ago and just getting back into it. The reason I picked 55 pulses per inch was that the maximum number that the hypotenuse calculation on X and Y was about 127 before it would go into overflow. I am using a 16F88 and I purchased an 18F2550 to give me a larger number to work with. I only have the student version of PBP so that’s why the choices. I haven’t tried the 18F2550 yet as I’m a beginner it looks very complicated.
I don’t know why there is not a smooth rise or fall on the output of the PWM but maybe using the PULSIN is not the way to go.
Using the ADC convertors may be faster responding.
I have lots of options to try. The encoders can put out a maximum of 2048 pulses per revolution or about 1500 pulses per inch. I can also feed them into a DAC chip to give me a voltage out.
You can buy these speed controllers commercially so it can be done but they are a bit too much money for me. May someone out there has one that they can reverse enginner for me?
Thank Jan
Hi,
> I don’t know why there is not a smooth rise or fall on the output of the PWM but maybe using the PULSIN is not the way to go.
It's because the PWM output is only updated after it has measured the pulsewidth of both X and Y, each taking several hundred ms since that is how wide the pulses are at slow speed. As the speed increases the update rate should too, to a point of course. Are you saying that the update rate remains slow even at higher speeds?
Lets look at it from another angle. What's the slowest PWM output update rate you can possibly live with? 5 times per second? 10? 20? 50?
Here's what I'm thinking: Increase the resolution of the encoders and feed them into two timer/counters on the PIC, one for X and one for Y. Now let the counters count pulses for as long as you can possibly wait between updating the output, read the count, differentiate from the previous count and you have a velocity value. Since the pulses are counted by the hardware timer/counters in the PIC they will be tracked simultanously as opposed to using PULSIN where they are measured sequentially.
You can do this with the 16F88 using TMR0 and TMR1 as counters and, for best results (but a bit more complicated), TMR2 as a timebase. You're going to have to select a resolution and timebase which doesn't overflow the 8 bit TMR0 register as the speed approaches max. For example, if the update rate is 10 times per second, there can be no more than 2550 pulses per second.
/Henrik.
Thanks Henrik.
I really appreciate your input. As a beginner it is sometimes hard to see past my own ideas and not realizing the amazing things these PIC’s can do. I am off to the workshop to try your ideas. I’ll let you know how things turn out.
Thanks again. Jan
Thanks again for your ideas. I increased the encoder resolution to about 2500 pluses per inch of travel and counted the pulses. I seems to work quite well with good low speed movement. My sewing machine drive is a servo so I need to feed it with a frequency. I feed the PWM output to a filter and then to an ADC ( AD654) chip to give me 0 to 15kHz out.
Now I am trying to improve the design and I was told to try changing the PWM to a 50% duty cycle and very the frequency (hpwm 1,127,W5). This idea gives me my 15K but the lowest I can get is about 1.5KHz and I really need close to 0.Code:'**************************************************************** '* Name : Pulse Count.BAS * '* Author : Jan * '* Notice : Copyright (c) 2013 [select VIEW...EDITOR OPTIONS] * '* : All Rights Reserved * '* Date : 27/12/2013 * '* Version : 1.0 * '* Notes : Count pulses in * '* : 16F88 * '**************************************************************** Include "modedefs.bas" ' Include serial modes define OSC 20 #CONFIG __config _CONFIG1, _HS_OSC & _WDT_ON & _LVP_OFF & _CP_OFF & _CCPMX_RB3 & _CCP1_RB3 #ENDCONFIG 'Configure CCP1 (RB3) to PWM out SO VAR PORTB.5 'Define serial out pin P1 var PORTA.0 'Define input pin X P2 VAR PORTA.1 'Define input pin Y W1 var WORD W2 VAR WORD W3 VAR WORD led var PORTB.0 TRISA = %11111111 ANSEL = %00000000 output led low led 'set led off displayloop: count P1,10,W1 COUNT P2,10,W2 W3 = (W1 HYP W2) 'HYPOTENUSE CALCULATION if W3 > 120 THEN 'Turn on lrd if Hypot is over HIGH LED 'Turn on led on RB0 ENDIF 'if W3 < 100 then 'low led 'endif Serout SO,N2400,[#W3] disp: Serout SO,N2400,[" Pulses",13,10] ' Display trailer hpwm 1,W3,2000 Goto DISPLAYLOOP ' Forever
I am trying to come up with a scheme that will use Timer 0 quickly sample the PWM output and replicate the output with a 1,500 hz offset. Any ideas would be appreciated.
Thanks JanCode:'**************************************************************** '* Name : Pulse Count.BAS * '* Author : Jan * '* Notice : Copyright (c) 2013 [select VIEW...EDITOR OPTIONS] * '* : All Rights Reserved * '* Date : 27/12/2013 * '* Version : 1.0 * '* Notes : Count pulses in * '* : 16F88 * '**************************************************************** Include "modedefs.bas" ' Include serial modes define OSC 20 #CONFIG __config _CONFIG1, _HS_OSC & _WDT_ON & _LVP_OFF & _CP_OFF & _CCPMX_RB3 & _CCP1_RB3 #ENDCONFIG 'Configure CCP1 (RB3) to PWM out SO VAR PORTB.5 'Define serial out pin P1 var PORTA.0 'Define input pin X P2 VAR PORTA.1 'Define input pin Y W1 var WORD W2 VAR WORD W3 VAR WORD W4 var word W5 var word led var PORTB.0 TRISA = %11111111 ANSEL = %00000000 output led low led 'set led off displayloop: count P1,10,W1 COUNT P2,10,W2 W3 = (W1 HYP W2) 'HYPOTENUSE CALCULATION if W3 > 120 THEN 'Turn on lrd if Hypot is over HIGH LED 'Turn on led on RB0 ENDIF W4 = (W3 + 20) 'Add 20 to overcome min pwm frequence W5 = (W4 * 100) 'Times 100 to give min of 2 kHz Serout SO,N2400,[#W5] disp: Serout SO,N2400,[" Pulses",13,10] ' Display trailer hpwm 1,127,W5 Goto DISPLAYLOOP ' Forever
Last edited by Demon; - 21st January 2014 at 02:31. Reason: Helped format your code using [CODE]...[/CODE] feature
Bookmarks