在机械上我已经设计好了一个机器人的腿,用了两个SG90的舵机可以实现它的运动,下面是我写的代码。
#include "hw_memmap.h"
#include "hw_types.h"
#include "sysctl.h"
#include "gpio.h"
#include "pwm.h"
#include "hw_ints.h"
#include "delay.h"
#define PH0_PWM2 GPIO_PIN_0
#define PH1_PWM3 GPIO_PIN_1
#define LED GPIO_PIN_6
unsigned int jiaodu[]={12000,16000,12000,8000};
unsigned int jiaodu1[]={12000,26000,12000,4000};
unsigned int jiaodu2[]={12000,20000,12000,4000,12000,16000,12000,8000};
//unsigned int jiaodu1[]={148000,140000,148000,156000};
void H_T();
void Q_J();
void Test();
/*********************************************************************************************************
** Function name: main()
** Descriptions: 主函数
** input parameters: NONE
** output parameters: NONE
** Returned value: NONE
*********************************************************************************************************/
int main (void)
{
SysCtlClockSet(SYSCTL_SYSDIV_25| /* 配置8Hz外部晶振作为主时钟 */
SYSCTL_USE_PLL|
SYSCTL_OSC_MAIN |
SYSCTL_XTAL_6HZ);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOH|SYSCTL_PERIPH_GPIOB /* 使能PWM2和PWM3输出所在GPIO */
SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM); /* 使能PWM模块 */
SysCtlPWMClockSet(SYSCTL_PWMDIV_1); /* PWM时钟配置:不分频 */
GPIOPinTypePWM(GPIO_PORTB_BASE,GPIO_PIN_0); /* PH0配置为PWM功能 */
GPIOPinTypePWM(GPIO_PORTB_BASE,GPIO_PIN_1); /* PH1配置为PWM功能 */
PWMGenConfigure(PWM_BASE, PWM_GEN_1, /* 配置PWM发生器1:加减计数 */
PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);
PWMGenPeriodSet(PWM_BASE, PWM_GEN_1, 160000); /* 设置PWM发生器1的周期 */
// PWMPulseWidthSet(PWM_BASE, PWM_OUT_2, jiaodu2[0]); /* 设置PWM2输出的脉冲宽度 */
// PWMPulseWidthSet(PWM_BASE, PWM_OUT_3, jiaodu2[0]); /* 设置PWM3输出的脉冲宽度 */
// PWMSyncUpdate(PWM_BASE,PWM_GEN_1_BIT);
PWMOutputState(PWM_BASE, (PWM_OUT_2_BIT | PWM_OUT_3_BIT), true); /* 使能PWM2和PWM3的输出 */
PWMGenEnable(PWM_BASE, PWM_GEN_1); /* 使能PWM发生器1, */
GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE,LED);
/* 开始产生PWM方波 */
// PWMGenIntTrigEnable(PWM_BASE,PWM_GEN_1,PWM_INT_CNT_ZERO);
// PWMIntEnable(PWM_BASE,PWM_INT_GEN_1);
// IntEnable(INT_PWM1);
// IntMasterEnable();
while(1)
{
Q_J();
H_T();
//Test();
}
}
void Q_J()
{
unsigned char i=1,j=1;
PWMPulseWidthSet(PWM_BASE, PWM_OUT_2, jiaodu[i++]); /* 设置PWM2输出的周期 */
//PWMPulseWidthSet(PWM_BASE, PWM_OUT_3, jiaodu[i]); /* 设置PWM3输出的周期 */
delay_ms(220);
PWMPulseWidthSet(PWM_BASE,PWM_OUT_3,jiaodu1[j++]);
delay_ms(220);
PWMPulseWidthSet(PWM_BASE,PWM_OUT_2,jiaodu[i]);
delay_ms(230);
}
void H_T()
{
unsigned char i=1,j=2;
PWMPulseWidthSet(PWM_BASE, PWM_OUT_2, jiaodu[i++]); /* 设置PWM2输出的周期 */
//PWMPulseWidthSet(PWM_BASE, PWM_OUT_3, jiaodu[i]); /* 设置PWM3输出的周期 */
delay_ms(220);
PWMPulseWidthSet(PWM_BASE,PWM_OUT_3,jiaodu1[j++]);
delay_ms(220);
PWMPulseWidthSet(PWM_BASE,PWM_OUT_2,jiaodu[i]);
delay_ms(230);
}
也可以用PWM的中断的功能来是想舵机的控制,我能过了也比较的不错。但是自己之后要想在加上ucosii,在中断的嵌套上害怕出问题,所以先不用中断来控制舵机,而用了硬件的延迟的方法。这个只是简单的两个舵机控制,周末把四条腿做出来能让它走起来再跟大家分享点好东西。 |