Society of Robots - Robot Forum

Software => Software => Topic started by: Joker94 on November 09, 2009, 05:27:31 AM

Title: PMW needed.
Post by: Joker94 on November 09, 2009, 05:27:31 AM
Hi

does anyone have a servopmw hex file they could post that i could use to test with as i am having some trouble and can not work out what the problem is.

It would be greatly appreciated.

thanks Joker94
Title: Re: PMW needed.
Post by: Joker94 on November 09, 2009, 03:28:02 PM
forgot to mention it is for a modifyed servo
Title: Re: PMW needed.
Post by: bsamuels on November 13, 2009, 10:31:51 PM
Do you mean PWM?

If so, here's the PWM file that I use for my servos. Unless your servo is digital, it should work regardless of modifications.

Code: [Select]
/***************************
******* PWM COMMANDS *******
--init the pwm
pwmInitH345();
pwmInitE345();

--start the pwm timers
pwmOnH3();
pwmOnH4();

--set pulse width
pwmSetH3(1500);

***************************/
#define pwmVer 1
#define pwmRev 0

/****************************************************************************
*
*   Copyright (c) 2008 Matt Bateman
*   Robotics4Fun http://www.laughingsky.com/hobbies/robotics/
*   (please link back if you use this code!)
*
*   This program is free software; you can redistribute it and/or modify
*   it under the terms of the GNU General Public License version 2 as
*   published by the Free Software Foundation.
*
*   Alternatively, this software may be distributed under the terms of BSD
*   license.
*
****************************************************************************/

/****************************************************************************
*   Version Notes
*
*   1.0   10/21/2008  Initial release
****************************************************************************/

//#define pwmDebug 1 // Turn on debug output
#define pwmShowInitStatus 1 // Display init status and version info

void pwmInitE345(void) {
/***************************************************/
/* Initialize timer for PWM use on pins E3, E4, E5 */
/***************************************************/
// 00 A off, toggle on compare
// 00 B on, toggle on compare
// 00 C on, toggle on compare
// 00 Low part of WGM: PWM, phase & freq, ICRn
TCCR3A=0x00;
// 0 No input noise cancelling
// 0 Input edge select does not matter
// 0 Not used
// 10 High part of WGM: PWM, phase & freq, ICRn
// 010 Prescale 8
TCCR3B=0x12;
// Clear TCNT
TCNT3H=0x00;
TCNT3L=0x00;

ICR3 = 20000; // 20mS PWM cycle time
}

void pwmOffE345(void) {
/**********************************************************/
/* Return timer and pins to normal use on pins E3, E4, E5 */
/**********************************************************/
// 00 A off, toggle on compare
// 00 B on, toggle on compare
// 00 C on, toggle on compare
// 00 Low part of WGM: Normal
TCCR3A=0x00;
// 0 No input noise cancelling
// 0 Input edge select does not matter
// 0 Not used
// 00 High part of WGM: Normal
// 000 Prescale None
TCCR3B=0x00;
// Clear TCNT
TCNT3H=0x00;
TCNT3L=0x00;

ICR3 = 0; // Clear ICR4
}
void pwmInitH345(void) {
/***************************************************/
/* Initialize timer for PWM use on pins H3, H4, H5 */
/***************************************************/
// 00 A off, toggle on compare
// 00 B on, toggle on compare
// 00 C on, toggle on compare
// 00 Low part of WGM: PWM, phase & freq, ICRn
TCCR4A=0x00;
// 0 No input noise cancelling
// 0 Input edge select does not matter
// 0 Not used
// 10 High part of WGM: PWM, phase & freq, ICRn
// 010 Prescale 8
TCCR4B=0x12;
// Clear TCNT
TCNT4H=0x00;
TCNT4L=0x00;

ICR4 = 20000; // 20mS PWM cycle time
}

void pwmOffH345(void) {
/**********************************************************/
/* Return timer and pins to normal use on pins H3, H4, H5 */
/**********************************************************/
// 00 A off
// 00 B off
// 00 C off
// 00 Low part of WGM: Normal
TCCR4A=0x00;
// 0 No input noise cancelling
// 0 Input edge select does not matter
// 0 Not used
// 00 High part of WGM: Normal
// 000 Prescale None
TCCR4B=0x00;
// Clear TCNT
TCNT4H=0x00;
TCNT4L=0x00;

ICR4 = 0; // Clear ICR4
}


void pwmOnE3(void) {
/****************************/
/* Put pin E3 into PWM mode */
/****************************/
// 10 A on, toggle on compare
sbi(TCCR3A,7);
cbi(TCCR3A,6);
}
void pwmOffE3(void) {
/********************************/
/* Return pin E3 to normal mode */
/********************************/
// 00 A off
cbi(TCCR3A,7);
cbi(TCCR3A,6);
}
void pwmOnE4(void) {
/****************************/
/* Put pin E4 into PWM mode */
/****************************/
// 10 B on, toggle on compare
sbi(TCCR3A,5);
cbi(TCCR3A,4);
}
void pwmOffE4(void) {
/********************************/
/* Return pin E4 to normal mode */
/********************************/
// 00 B off
cbi(TCCR3A,5);
cbi(TCCR3A,4);
}
void pwmOnE5(void) {
/****************************/
/* Put pin E5 into PWM mode */
/****************************/
// 10 C on, toggle on compare
sbi(TCCR3A,3);
cbi(TCCR3A,2);
}
void pwmOffE5(void) {
/********************************/
/* Return pin E5 to normal mode */
/********************************/
// 00 C off
cbi(TCCR3A,3);
cbi(TCCR3A,2);
}
void pwmOnH3(void) {
/****************************/
/* Put pin H3 into PWM mode */
/****************************/
// 10 A on, toggle on compare
sbi(TCCR4A,7);
cbi(TCCR4A,6);
}
void pwmOffH3(void) {
/********************************/
/* Return pin H3 to normal mode */
/********************************/
// 00 A off
cbi(TCCR4A,7);
cbi(TCCR4A,6);
}
void pwmOnH4(void) {
/****************************/
/* Put pin H4 into PWM mode */
/****************************/
// 10 B on, toggle on compare
sbi(TCCR4A,5);
cbi(TCCR4A,4);
}
void pwmOffH4(void) {
/********************************/
/* Return pin H4 to normal mode */
/********************************/
// 00 B off
cbi(TCCR4A,5);
cbi(TCCR4A,4);
}
void pwmOnH5(void) {
/****************************/
/* Put pin H5 into PWM mode */
/****************************/
// 10 C on, toggle on compare
sbi(TCCR4A,3);
cbi(TCCR4A,2);
}
void pwmOffH5(void) {
/********************************/
/* Return pin H5 to normal mode */
/********************************/
// 00 C off
cbi(TCCR4A,3);
cbi(TCCR4A,2);
}

/******************************/
/* Set pin pulse times in uS. */
/* Typical servo would use    */
/*     1500 for center        */
/*     1000 for full left     */
/*     2000 for full right    */
/******************************/
#define pwmSetE3(val) OCR3A=val // Set E3 pulse time in uS
#define pwmSetE4(val) OCR3B=val // Set E4 pulse time in uS
#define pwmSetE5(val) OCR3C=val // Set E5 pulse time in uS
#define pwmSetH3(val) OCR4A=val // Set H3 pulse time in uS
#define pwmSetH4(val) OCR4B=val // Set H4 pulse time in uS
#define pwmSetH5(val) OCR4C=val // Set H5 pulse time in uS



void pwmInit(void) {
// Intialize the PWM module
#ifdef pwmShowInitStatus
rprintf("      PWM:\t%d.%d\t",pwmVer,pwmRev);
rprintf("done\n");;
#endif
}
Title: Re: PMW needed.
Post by: Joker94 on November 14, 2009, 04:05:20 AM
thanks bsamuels, would it be possible if you could send me a useable hex file as i am having some trouble and want to test my setup.