32单片机控制电调

 

通过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

 

添加一位同学的补充:

2019.4.20

 

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值