通过32单片机输出特定pwm波,驱动电调进而控制推进器。
- 对于单个的推进器进行控制,有时候数据手册提供的控制条件范围不准确;
- 明确速度变化pwm波的输出区间;
- 整体程序编写。
推进器的选取,如图1所示推进器型号为T200水下推进器,图2为此次使用电调,资料在对应论坛下载
http://forum.bluerobots.cn/t/topic/261下载。
图1 T200推进器
图2 ESC30电调
电调一般是需要特定的频率波形才能进行驱动。32产生pwm波可以自己设定定时器模拟,也可以进行库里面的pwm波通道输出。
(1) 主函数代码(测试用,通过按键逐步增加占空比)
int main(void)
{
u16 led0pwmval=0;
int dir=0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200); //串口配置
LED_Init();
KEY_Init(); //按键初始化
TIM3_PWM_Init(19999,71); //输出制定的电调要求的50HZ频率波
while(1)
{
switch(KEY_Scan(0))
{
case 1:
{
dir++;
TIM_SetCompare2(TIM3,1100+100*dir);//根据资料数据提供
USART_SendData(USART1,'2');//为了便于检测是否按键执行正确,其实是通过看有几个2来确定输出的占空比
} break;
default:break;
}
}
}
(2)按键检测(直接用的正点原子的,象征性的贴出代码)
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1;//
if(mode)key_up=1; //
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
{
delay_ms(10);//
key_up=0;
if(KEY0==0)return KEY0_PRES;
else if(KEY1==0)return KEY1_PRES;
else if(KEY2==0)return KEY2_PRES;
else if(WK_UP==1)return WKUP_PRES;
}else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1;
return 0;//
}
(3) PWM波输出配置
void TIM3_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//TIM3
TIM_TimeBaseStructure.TIM_Period = arr; //
TIM_TimeBaseStructure.TIM_Prescaler =psc; //
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //
//TIM3 Channel2 PWM
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //
TIM_Cmd(TIM3, ENABLE);
}
(4)而后不确定的就可以先通过示波器看输出的pwm波的频率与占空比是否正确,通过论坛资料吧输出的高电平需要为3.3V,在接推进器时,实现进行板子pwm输出测试,如图3所示。
(a)输出电平
(b)输出占空比情况
图3 测试情况
在测试时,我设置的基PWM高电平时间为1100us,通过按键当PWM高电平时间为1600us时,推进器运行。在高电平时间为1400时,推进器第二次声响,但是没有转动,当为1600us时启动。
待更新中。。。1.19