处理与响应部分是放在一个定时器里面去执行的,以下是部分代码,仅供测试用:
#include "main.h"
void TIM6_Config(void)
{
TIM_TimeBaseInitTypeDef tim;
NVIC_InitTypeDef nvic;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);
nvic.NVIC_IRQChannel = TIM6_DAC_IRQn;
nvic.NVIC_IRQChannelPreemptionPriority = 0;
nvic.NVIC_IRQChannelSubPriority = 0;
nvic.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&nvic);
tim.TIM_Prescaler = 84-1;
tim.TIM_CounterMode = TIM_CounterMode_Up;
tim.TIM_ClockDivision = TIM_CKD_DIV1;
tim.TIM_Period = 50000;
TIM_TimeBaseInit(TIM6,&tim);
}
void TIM6_Start(void)
{
TIM_Cmd(TIM6, ENABLE);
TIM_ITConfig(TIM6, TIM_IT_Update,ENABLE);
TIM_ClearFlag(TIM6, TIM_FLAG_Update);
}
DBUS dbus;
Speed3D speed3D;
Speed4D speed4D;
//control interval : 50ms
void TIM6_DAC_IRQHandler(void)
{
if (TIM_GetITStatus(TIM6,TIM_IT_Update)!= RESET)
{
TIM_ClearITPendingBit(TIM6,TIM_IT_Update);
TIM_ClearFlag(TIM6, TIM_FLAG_Update);
/*******************switch s2 to choose RC mode*********************/
if(dbus.rc.s2==SW_UP)
{
/*****************body move control*******************/
//linearly scale
speed3D.speed_x = scale(dbus.rc.ch0,CH_VALUE_MIN,CH_VALUE_MAX,EC60CMIN,EC60CMAX);
speed3D.speed_y = scale(dbus.rc.ch1,CH_VALUE_MIN,CH_VALUE_MAX,EC60CMIN,EC60CMAX);
speed3D.speed_r = scale(dbus.rc.ch2,CH_VALUE_MIN,CH_VALUE_MAX,EC60CMIN,EC60CMAX);
//Speed3D->Speed4D,according to the speed transfer matrix of mecanum wheel
MecDecSpeed(&speed3D,&speed4D);
//transmit wheel speed to EC60 motor
EC60Cmd(speed4D.speed_fr,speed4D.speed_fl,speed4D.speed_bl,speed4D.speed_br);
/*****************pan-tilt control*******************/
/*****************fire control*******************/
if(dbus.rc.s1==SW_UP)
{
//E310Cmd(1500,1500);
RM6025Cmd(2000,2000);
}
else if(dbus.rc.s1==SW_DOWN)
{
//E310Cmd(1000,1000);
RM6025Cmd(-2000,-2000);
}
else
{
RM6025Cmd(0,0);
}
}
}
}
|