32单片机控制电调

2019-04-14 08:56发布

  通过32单片机输出特定pwm波,驱动电调进而控制推进器。
  1. 对于单个的推进器进行控制,有时候数据手册提供的控制条件范围不准确;
  2. 明确速度变化pwm波的输出区间;
  3. 整体程序编写。
推进器的选取,如图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