zoukankan      html  css  js  c++  java
  • stm32 pwm 电调 电机

    先上代码

    python 树莓派版本,通俗表现原理。stm32 C语言版本在后面

    import RPi.GPIO as GPIO
    import time
    
    
    mode=2
    IN1=11
    
    def setup():
        GPIO.setwarnings(False)
        GPIO.setmode(GPIO.BOARD)
        GPIO.setup(IN1, GPIO.OUT)
    
    def set():
        print "set"
        try:
                print "High"
                while(1):
                    GPIO.output(IN1,0)
                    time.sleep(0.02-0.002)
                    GPIO.output(IN1,1)
                    time.sleep(0.002)
        except:
                print "low"
                while(1):
                    GPIO.output(IN1,0)
                    time.sleep(0.02-0.001)
                    GPIO.output(IN1,1)
                    time.sleep(0.001)
    
    
    def loop():
        print "LOOP"
        print "run"
        try:
            while(1):
                    GPIO.output(IN1,0)
                    time.sleep(0.02-0.001)
                    GPIO.output(IN1,1)
                    time.sleep(0.001)
        except:
            while(1):
                    GPIO.output(IN1,0)
                    time.sleep(0.02-0.00199)
                    GPIO.output(IN1,1)
                    time.sleep(0.00199)
            '''
            if(up>=0.018):
                up=up
            else:
                up=up+0.0001
            '''
    setup()
    if( mode==1):
            set()
    elif(mode==2):
            loop()
    

    C语言版本

    /***********************************************
    功能:输出PWM的定时器2初始化
    输入参数:无
    输出:无
    描述:调用该函数,初始化定时器2为PWM输出模式
    硬件连接:PA0,PA1,PA2,PA3
    ***********************************************/
    void MotorInit(void)
    {
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
    	
        uint16_t PrescalerValue = 0;    //控制电机PWM频率
        
        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //打开外设A的时钟和复用时钟
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 ,ENABLE);   //打开定时器2时钟  
        
        
        // 设置GPIO功能。
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
    		
        
        // 复位定时器。
        //TIM_DeInit(TIM2);
        
        // 配置计时器。
        //PrescalerValue = (uint16_t) (SystemCoreClock / 24000000) - 1;
        PrescalerValue =71;
        TIM_TimeBaseStructure.TIM_Period = 19999;		            //设为50hz
        TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;	//pwm时钟分频
        TIM_TimeBaseStructure.TIM_ClockDivision = 0;	
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
        
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
        
        
        // 配置TIM2为PWM输出模式
        //TIM_OCStructInit(&TIM_OCInitStructure);
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        //TIM_OCInitStructure.TIM_Pulse = 0;    //0
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
        
        TIM_OC1Init(TIM2,&TIM_OCInitStructure);
        TIM_OC2Init(TIM2,&TIM_OCInitStructure);
        TIM_OC3Init(TIM2,&TIM_OCInitStructure);
        TIM_OC4Init(TIM2,&TIM_OCInitStructure);
        
        TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
        TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);
        TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);
        TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);
        
        // 启动计时器。
        TIM_Cmd(TIM2,ENABLE);
        //printf("Motor init success...
    ");
    }
    
    
    
    
    
    //下面是启动方法
    
    	TIM_SetCompare1(TIM2,999);
    	TIM_SetCompare2(TIM2,999);
    	TIM_SetCompare3(TIM2,999);
    	TIM_SetCompare4(TIM2,999); //先把油门打到最低,即高电平为1ms
    	delay_ms(1800);//等待电机确认
    	delay_ms(1800);
    	delay_ms(1800);
    	delay_ms(1800);
    	delay_ms(1800);
    	delay_ms(1800);
    	delay_ms(1800);
    	delay_ms(1800);
    	TIM_SetCompare1(TIM2,1800); //再把高电平时间设为1~2ms
    	TIM_SetCompare2(TIM2,1800);
    	TIM_SetCompare3(TIM2,1800);
    	TIM_SetCompare4(TIM2,1800);
    
    

    之前做过T形马达的小车,是通过pwm波控制小车速度,四轴飞行器的无刷电机也差不多。控制方法如下所述

    控制频率

    我的电调控制频率(pwm波的频率)50Hz就ok了。有的电调可能要500Hz或者其它的数值

    所谓油门

    油门就是pwm波的高电平持续时间(也可能是指占空比,over)

    控制方法

    第一次启动设置行程

    先让控制器输出50Hz(T=20ms),高电平时间为2ms的pwm波,然后给电调上电。持续这个波一会儿到提示音响起。搞不清楚各种提示音的话就估摸着2、3s就行了。
    然后立即让控制器输出50Hz,高电平时间为1ms的pwm波,持续一会儿到提示音响起。这个时候你可以断电了。

    正常情况下启动电机

    先让控制器输出50Hz,高电平持续时间为1ms的pwm波,然后给电调上电。持续一会儿听到提示音后,把高电平时间调为1~2ms之间,电机就启动了。

    珍爱生命,注意安全

  • 相关阅读:
    【读书笔记《Android游戏编程之从零开始》】6.Android 游戏开发常用的系统控件(TabHost、ListView)
    【读书笔记《Android游戏编程之从零开始》】5.Android 游戏开发常用的系统控件(ProgressBar、Seekbar)
    【读书笔记《Android游戏编程之从零开始》】4.Android 游戏开发常用的系统控件(EditText、CheckBox、Radiobutton)
    【读书笔记《Android游戏编程之从零开始》】3.Android 游戏开发常用的系统控件(Button、Layout、ImageButton)
    【读书笔记《Android游戏编程之从零开始》】2.Hello,World!
    【读书笔记《Android游戏编程之从零开始》】1.Android 平台简介与环境搭建
    【Android Demo】通过WebService获取今日天气情况
    布局优化之ViewStub源码分析
    http2.0与http1.X的区别
    OkHttpHelper使用
  • 原文地址:https://www.cnblogs.com/uestcman/p/9416780.html
Copyright © 2011-2022 走看看