|
|
|
![]() |
|
|||||||
|
||||||||
![]() |
| Thread Tools | Rate Thread | Display Modes |
|
#1
|
||||
|
||||
|
PWM 13-16 Replacement Code
For those who are using interrupts and don't like the jittery PWM outputs on channels 13 through 16, I've written replacement code for IFI's Generate_Pwms() function that uses the built-in CCP hardware to generate super accurate PWM pulses. The code also allows you to set the neutral point and gain for each output channel, giving you complete control of your servos and motors. As an example, this code allows you to map the entire 0-255 PWM range into a small fraction of the normal travel of a servo arm, which would come in handy if you wanted to make a more accurate range calculation to the green light.
I'd like to do a quick beta test to find any bugs or documentation problems before posting it to my web page. If you're interested in helping out, you can download the code here: http://kevin.org/frc/frc_pwm.zip. If you find any problems with code or documentation, please leave a message here. -Kevin Edit: Changed link to point to released code. Last edited by Kevin Watson : 16-01-2007 at 02:34. |
|
#2
|
||||
|
||||
|
Re: PWM 13-16 Replacement Code Beta Test
Quote:
|
|
#3
|
||||
|
||||
|
Re: PWM 13-16 Replacement Code Beta Test
So how exactly would this effect the servos controlling the camera? Would it make them move smoother, more accurate?
Looks cool |
|
#4
|
||||
|
||||
|
Re: PWM 13-16 Replacement Code Beta Test
Is there any reason that you couldn't use "int"s to store your motor speeds and have a greater range of values with the higher precision obtained by using the CCP (that is, instead of using the gain and center #defines)? I looked through the code and don't see why this wouldn't work, what i mean is something like this as a change to the PWM() function:
Code:
void PWM(unsigned int pwm_13, unsigned int pwm_14, unsigned int pwm_15, unsigned int pwm_16)
{
// int temp_pwm_13;
// int temp_pwm_14;
// int temp_pwm_15;
// int temp_pwm_16;
// .........
// calculate the number of 100 ns timer ticks
// needed to match the desired PWM pulse width
temp_pwm_13 = (PWM_13_GAIN * ((int)pwm_13 - 127)) + PWM_13_CENTER;
temp_pwm_14 = (PWM_14_GAIN * ((int)pwm_14 - 127)) + PWM_14_CENTER;
temp_pwm_15 = (PWM_15_GAIN * ((int)pwm_15 - 127)) + PWM_15_CENTER;
temp_pwm_16 = (PWM_16_GAIN * ((int)pwm_16 - 127)) + PWM_16_CENTER;
// load the CCP compare registers
CCPR2L = LOBYTE(pwm_13);
CCPR2H = HIBYTE(pwm_13);
CCPR3L = LOBYTE(pwm_14);
CCPR3H = HIBYTE(pwm_14);
CCPR4L = LOBYTE(pwm_15);
CCPR4H = HIBYTE(pwm_15);
CCPR5L = LOBYTE(pwm_16);
CCPR5H = HIBYTE(pwm_16);
//..............
|
|
#5
|
||||
|
||||
|
Re: PWM 13-16 Replacement Code Beta Test
Quote:
-Kevin |
|
#6
|
||||
|
||||
|
Re: PWM 13-16 Replacement Code Beta Test
Quote:
Quote:
-Kevin |
|
#7
|
|||
|
|||
|
Re: PWM 13-16 Replacement Code Beta Test
Looks great. I'll use it tomorrow and post back with results.
|
|
#8
|
||||
|
||||
|
Re: PWM 13-16 Replacement Code Beta Test
Hey Kevin? Does your code leave a pause between pulses sent from the CCP module? After looking at your code I did not see anything to indicate this. The reason I ask is because I have noticed that when continuous pulses are sent to a servo using the CCP module, the servo exhibits jitter. I have found that a 2ms delay or greater between pulses will stop this behavior. Have you encountered similar behavior?
|
|
#9
|
||||
|
||||
|
Re: PWM 13-16 Replacement Code Beta Test
Quote:
-Kevin |
|
#10
|
||||
|
||||
|
Re: PWM 13-16 Replacement Code Beta Test
Quote:
|
|
#11
|
||||
|
||||
|
Re: PWM 13-16 Replacement Code Beta Test
You can do this. Last year I cobbled together a similar set of routines for controlling PWM13 and 14 for the camera with 10 bit precision instead of 8 bit precision. I'll see if I can still find the code (we ended up not using the camera in the end, so that code got removed since it wasn't needed).
|
|
#12
|
||||
|
||||
|
Re: PWM 13-16 Replacement Code Beta Test
Quote:
I've already enumerated some other advantages above. Quote:
For grins, I used digital servos (not FRC legal) with my code and after modifying tracking.c a bit, I can find a green light and start tracking in somewhere between one and two seconds, without the software having any a priori knowledge of where the light is located. I suspect nearly the same level of performance can be had with the HS322HD servos. -Kevin |
|
#13
|
|||
|
|||
|
Re: PWM 13-16 Replacement Code Beta Test
Kevin,
I would expect that the code should work fine. We (1126) used my version throughout the 2006 season without any issues. Your increase in gain from 40 to 50 is probably a good idea, as we found one of the Victors did not quite go to maximum at the high end (2 msec) without recalibration. The additional 25% on range should easily eliminate this potential problem. You may want to think about modifying your "temp_pwm_xx" calculation so it doesn't require the signed int multiplication. This adds a fair amount of execution time to the routine (relative to how quick it could execute, not to overall processor usage which is extremely minor). It also requires the use of the MATH_DATA section so if someone ever wanted to use the routine from within an interrupt (why? I don't know, but I never rule anything out), they would need to save that data section. I do like the addition of the CENTER & GAIN options it allows for much more flexibility. Mike |
|
#14
|
|||||
|
|||||
|
Re: PWM 13-16 Replacement Code Beta Test
So... is the legality of this confirmed?
-Adam |
|
#15
|
||||
|
||||
|
Re: PWM 13-16 Replacement Code Beta Test
Quote:
I used the signed int so that I don't have to worry about underflow when the subtraction takes place. I'll have another look to see if I can move the terms around to get rid of the int. -Kevin |
![]() |
| Thread Tools | |
| Display Modes | Rate This Thread |
|
|
Similar Threads
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Vex start up code run PWM outputs without Rx | intellec7 | Programming | 3 | 05-05-2006 23:29 |
| Pwm 11, 12 and CMU code | Chris Bright | Programming | 3 | 01-02-2005 19:34 |
| Victor Replacement | JamesCH95 | Electrical | 4 | 15-12-2004 20:12 |
| Replacement Parts | archiver | 1999 | 0 | 23-06-2002 22:01 |
| replacement gears | joni_m | Technical Discussion | 1 | 22-01-2002 18:01 |