精华内容
下载资源
问答
  • pwm控制电机

    2018-04-25 22:09:08
    只是一个简单的pwm控制电机,速度可调,例程中默认用A端口pin6引脚,自己可以根据情况自定义
  • PWM控制电机

    千次阅读 2020-06-22 10:36:30
    缺点:控制电路复杂。 (2)单极模式,即电机电枢驱动电压极性是单一的 优点:启动快,能加速,刹车,能耗制动,能量反馈,调速性能不如双极模式好,但是相差不多,电机特性也比较好。如果接成H桥模式,也能实现反转。...

    先简单说说这几种模式
    (1)双极模式,即电枢电压极性是正负交替的,
       优点:能正反转运行,启动快,调速精度高,动态性能好,调速静差小,调速范围大,能加速,减速,刹车,倒转,能在负载超过设定速度时,提供反向力矩,能克服电机轴承的静态摩擦力,产生非常低的转速。
       缺点:控制电路复杂。
    (2)单极模式,即电机电枢驱动电压极性是单一的
       优点:启动快,能加速,刹车,能耗制动,能量反馈,调速性能不如双极模式好,但是相差不多,电机特性也比较好。如果接成H桥模式,也能实现反转。
    在负载超速时也能提供反向力矩。
       缺点:刹车时,不能减速到0,速度接近0速度时没有制动力。不能突然倒转。动态性能不好,调速静差稍大。
    (3)受限单极模式,即除了单极调制外,能耗制动通路受到了限制。
       优点:控制电路简单,如果接成H桥模式,也能正反转。
       缺点:不能刹车,不能能耗制动,在负载超过设定速度时不能提供反向力矩。

            调速静差大,调速性能很差,稳定性也不好。

    首先,这里的PWM和PWM 都是已经经过处理后,能直接驱动功率管的信号,而不是单片机输出的PWM信号,至于MOS管的驱动方法,这里不讨论。
    ___
    PWM 信号是和PWM信号互补的,逻辑上互补,而不是电平的互补。
    还有默认这两个信号已经经过了死区控制,不回产生同时导通的问题。
    除了第一个图外,功率管上必须并联续流二极管,要么是MOS管里自带的,要么就是BJT再并联的,或者MOS管并联肖特基。

    其实我们大家平时控制电机用的都是如图1所示的那种样子,
    这种模式叫受限单极调制,只有加速和调速功能,是没有刹车功能的,电机速度下降靠负载摩擦,也没有负力矩。
    比如说,设定速度是50%,但是电机因为外力速度达到了60%了,电机也不会减速,只有电机速度超过100%时,电机产生的反电动势超过了电源电压,才会产生反向力矩,那个另当别论。
    像以前的有刷电动自行车采用的就是这种控制方法,只能加速,不能减速,速度控制也不精确,但是足够满足要求了。

    其次,我们想要电机实现正反转,也只不过是用到了图2和图4的样子,
    这个虽然是接成了H桥的样子,但是实际上还是受限单极调制,把图2的Q4拿掉,Q1变成一个二极管,电路就又变成了图1的样子。其他的图都同理。

     

    单极调制和双极调制

    如果想得到有刹车的功能,     ___
    就必须使用一个与PWM信号互补的PWM信号。
    这个信号在PWM关断期间,为电机提供一个续流通道,
    相当于开关电源的同步续流吧,也有称之为同步整流。
    按道理,那个二极管也能提供续流通道如图6中的Q1,
    但是用MOS管作为续流通道有2个好处,
    第一,导通压降低,比二极管发热更少,效率更高,
    第二,二极管上不能产生反向电流,而MOS管可以通过反向电流
          其实二极管的反向电流对于MOS管来讲是正向电流,
          电机反电动势在PWM关断时间的伏秒数 大于 电源电压在PWM开通时间加在电机上的伏秒数,小于,那么电机会产生反向电流,使电机产生反向力矩,
          因为直流永磁电机的力矩是正比例于电流的,反向电流就会产生反向力矩。视这个电流的大小,电机就能减速或者刹车了。而且电机上的这个反向电流还会在PWM开通时间回馈到电源中去,做到了能量回馈。如果电源是二次电池,那么这是有好处的,如果不是电池的话,会使母线电压升高,要做一些能量消耗的措施。
          说白了,就是你的PWM占空比就能控制电机的转速,电机的转速会跟随的你PWM占空比变化,你的占空比加大,电机就会加速,你的占空比减小,电机就会减速,你减得快,就相当于刹车,如果控制得好,可以做到很迅速但是又很柔和的刹车效果。
        但是如果你的占空比突然减到0,就相当于把电机短路了,这是急刹车,会不会损坏要看电机的内阻,功率,惯性,还要看功率管的过载能力。当然还考验电机的机械强度,因为这种刹车从表面上看,就好像直接用硬物把电机卡住的效果差不多,发出的声响也是十分巨大的金属声。
          当然,还有更急的刹车办法,就是把电机切换到反向运行状态,但是这种方法是有很大的隐患的,往往会造成器件损坏。
        不过话又说回来了,那种受限单极PWM调制方法,只能使用这1种刹车或减速模式,既没有好的效果,又容易损伤器件。
        所以如果需要电机带刹车的话,尽量使用单极调制或双极调制,不要使用受限单极调制模式。
        一般电动轮椅的电机都是采用这种模式控制的。
        
        再说说双极模式,
        双极模式,只有H桥一种接法,而且4只管子同时工作。如图11
        斜对角的两个管子通相同相位的信号,如Q1和Q4,而另外两只管子用与之互补的信号驱动。在PWM导通器件,电机两端的驱动电压是正的,在PWM关断器件,电机两端驱动电压是负的。
        当PWM占空比为50%时,电机保持静止状态,当PWM占空比大于50%时,电机正转,当PWM占空比小于50%时,电机反转。
        其实当占空比为50%时,电机并不是静止的,而是在原地抖动,因为电机上的电流也是一个交流的,这个抖动能有效克服电机的静摩擦,使电机能快速启动,迅速反应,适用与需要动态性能好的场合,比如说,光驱里面控制光头前后移动的电机,直流伺服电机,还有就是现在匠人正做的那个二轮小车驱动车轮的电机也适合用这个方法来驱动。
        当然了,单极和双极调制也可以把4只管子都关断,使电机自由减速,而不是靠方向力矩来进行减速。
    展开全文
  • STM32F429使用PWM控制电机转速-附件资源
  • 内含芯片手册,接线图,源码,适合新手快速学习掌握。
  • pwm控制电机原理

    千次阅读 2021-04-06 11:31:32
    电动机是由定子和转子组成,一个产生旋转磁场,一个为磁极,电机的转子(轴承)就转起来了。 这便实现了 电能->磁能->机械能的转换 下面两个图可以更直观的理解: 那么关于电机我们不做深究, 我们只需要知道...

    首先我们要明白电机的原理

    电机 简单来说就是 实现电能与机械能相互转换的电工设备
    那么我们经常使用的直流电机原理就是:

    电生磁:通电导线会产生磁场
    也就是电磁感应 旋转磁场带动转子转动。
    电动机是由定子和转子组成,一个产生旋转磁场,一个为磁极,电机的转子(轴承)就转起来了。

    这便实现了 电能->磁能->机械能的转换

    下面两个图可以更直观的理解:
    在这里插入图片描述

    在这里插入图片描述

    那么关于电机我们不做深究,
    我们只需要知道,电机的本质,就是线圈 也就是电感元件

    同时我们知道电感有防止电流突变的作用

    关于PWM的原理请参照这篇博客:

    https://blog.csdn.net/as480133937/article/details/103439546

    那么,我们来浅析一下:

    通电导线在磁场中受到的力称为安培力。
    而安培力的公式:
    F=BIL

    在其他条件不变的情况下,控制其通过的电流即控制安培力的大小

    那么,电机的电阻R 是基本不变的 电流I 就等于 I = U/R

    F= BLU/R

    在R B L不变的情况 控制安培力的大小,本质就是修改供电电压的大小

    我们也就知道,控制电机转速的本质就是给电机供不同的供电电压

    电压越大,电机转速越快

    那么我们知道 PWM的本质就是脉宽调制,通过输出不同的占空比,从而将直流电压转换成不同电压值的模拟信号

    原理
    占空比可以实现对电机转速的调节,我们知道,占空比是高电平在一个周期之中的比值,高电平的所占的比值越大,占空比就越大,对于直流电机来讲,电机输出端引脚是高电平电机就可以转动,当输出端高电平时,电机会转动,但是是一点一点的提速,在高电平突然转向低电平时,电机由于电感有防止电流突变的作用是不会停止的,会保持这原有的转速,以此往复,电机的转速就是周期内输出的平均电压值,所以实质上我们调速是将电机处于一种,似停非停,似全速转动又非全速转动的状态,那么在一个周期的平均速度就是我们占空比调出来的速度了,

    总结: 在电机控制中,电压越大,电机转速越快,而通过PWM输出不同的模拟电压,便可以使电机达到不同的输出转速

    当然,在电机控制中,不同的电机都有其适应的频率 频率太低会导致运动不稳定,如果频率刚好在人耳听觉范围,有时还会听到呼啸声。频率太高的电机可能反应不过来

    正常的电机频率在 6-16kHZ之间为好

    输出的电压就不同,电机转速就不同。那我们可以知道,通过滑动变阻器或者更换不同电压的电源都可以实现电机的调速,但是在实际应用中显然pwm更方便些。

    专业一点的话就是

    所谓PWM就是脉宽调制器,通过调制器给电机提供一个具有一定频率的脉冲宽度可调的脉冲电。脉冲宽度越大即占空比越大,提供给电机的平均电压越大,电机转速就高。反之脉冲宽度越小,则占空比越越小。提供给电机的平均电压越小,电机转速就低。

    展开全文
  • PWM 控制电机噪音解决

    2015-04-29 11:37:22
    无刷电机驱动噪音的解决方法,主要针对方波驱动导致的噪音
  • AVR单片机 PWM控制电机

    2013-08-23 11:39:18
    PWM控制电机转动 已实现功能 没有问题
  • pwm控制电机转速原理浅析

    万次阅读 多人点赞 2020-01-29 16:26:23
    所谓PWM就是脉宽调制器,通过调制器给电机提供一个具有一定频率的脉冲宽度可调的脉冲电。脉冲宽度越大即占空比越大,提供给电机的平均电压越大,电机转速就高。反之脉冲宽度越小,则占空比越越小。提供给电机的平均...

    首先我们要明白电机的原理

    电机 简单来说就是 实现电能与机械能相互转换的电工设备

    那么我们经常使用的直流电机原理就是:

    电生磁:通电导线会产生磁场
    在这里插入图片描述
    也就是电磁感应 旋转磁场带动转子转动。
    电动机是由定子和转子组成,一个产生旋转磁场,一个为磁极,电机的转子(轴承)就转起来了。

    这便实现了 电能->磁能->机械能的转换

    下面两个图可以更直观的理解:
    在这里插入图片描述
    在这里插入图片描述

    那么关于电机我们不做深究,
    我们只需要知道,电机的本质,就是线圈 也就是电感元件

    同时我们知道电感有防止电流突变的作用

    关于PWM的原理请参照这篇博客:

    《PWM原理 PWM频率与占空比详解》

    那么,我们来浅析一下:

    通电导线在磁场中受到的力称为安培力
    而安培力的公式:
    F=BIL

    在其他条件不变的情况下,控制其通过的电流即控制安培力的大小

    那么,电机的电阻R 是基本不变的 电流I 就等于 I = U/R

    F= BLU/R

    在R B L不变的情况 控制安培力的大小,本质就是修改供电电压的大小

    我们也就知道,控制电机转速的本质就是给电机供不同的供电电压

    电压越大,电机转速越快

    那么我们知道 PWM的本质就是脉宽调制,通过输出不同的占空比,从而将直流电压转换成不同电压值的模拟信号

    具体看这里:
    《PWM原理 PWM频率与占空比详解》

    原理:
    占空比可以实现对电机转速的调节,我们知道,占空比是高电平在一个周期之中的比值,高电平的所占的比值越大,占空比就越大,对于直流电机来讲,电机输出端引脚是高电平电机就可以转动,当输出端高电平时,电机会转动,但是是一点一点的提速,在高电平突然转向低电平时,电机由于电感有防止电流突变的作用是不会停止的,会保持这原有的转速,以此往复,电机的转速就是周期内输出的平均电压值,所以实质上我们调速是将电机处于一种,似停非停,似全速转动又非全速转动的状态,那么在一个周期的平均速度就是我们占空比调出来的速度了,

    总结: 在电机控制中,电压越大,电机转速越快,而通过PWM输出不同的模拟电压,便可以使电机达到不同的输出转速

    当然,在电机控制中,不同的电机都有其适应的频率 频率太低会导致运动不稳定,如果频率刚好在人耳听觉范围,有时还会听到呼啸声。频率太高的电机可能反应不过来

    正常的电机频率在 6-16kHZ之间为好

    输出的电压就不同,电机转速就不同。那我们可以知道,通过滑动变阻器或者更换不同电压的电源都可以实现电机的调速,但是在实际应用中显然pwm更方便些。

    专业一点的话就是:

    所谓PWM就是脉宽调制器,通过调制器给电机提供一个具有一定频率的脉冲宽度可调的脉冲电。脉冲宽度越大即占空比越大,提供给电机的平均电压越大,电机转速就高。反之脉冲宽度越小,则占空比越越小。提供给电机的平均电压越小,电机转速就低。

    展开全文
  • (hal库)定时器1输出多路脉冲宽度可变的PWM控制电机(中断方式) 分为以下步骤 /***************************************************************************/ 1、stm32cubeMX配置项目参数 2、使用sw4stm32软件...
  • 电机控制程序的三方面要点: 一、定时器的输出通道设置 二、电机频率的设定 三、占空比输入函数的设计 对于电机来说,转速与转向是最...一个定时器输出四路PWM控制四个电机。 在硬件上需要四个正反转控制引脚,四个PWM

    电机控制程序的三方面要点:

    一、定时器的输出通道设置
    二、电机频率的设定
    三、占空比输入函数的设计

    对于电机来说,转速与转向是最重要的表现。这里的程序是针对四个直流无刷电机来编写的。
    控制四个电机,是需要电机驱动板的,因为驱动电机需要的是电压,而芯片定时器外设所具有的的PWM输出的GPIO引脚,输出的是0/1组成的PWM波,而不是电压。所以我们需要电机驱动板来进行两者的转变。

    我常用的是做智能车用的DR8701E芯片的驱动板。一个定时器输出四路PWM控制四个电机。

    在硬件上需要四个正反转控制引脚,四个PWM输出引脚。具体信息详见my_motor.h。

    电机频率的设定:
    电机频率设定公式:
    ARR :自动重装载寄存器的值

    // CLK_cnt:计数器的时钟,等于 Fck_int / (psc+1) = 72M/(psc+1)
    // PWM 信号的周期 T = ARR * (1/CLK_cnt) = ARR*(PSC+1) / 72M
    // 占空比P=CCR/(ARR+1)

    倒推一下
    (72MHZ= 72 000 000 HZ)

    -》假如电机想设定的频率是10kHZ=10 000HZ
    -》得出周期是T=1/f=1/10000s
    -》得出等式 1/10 000=ARR*(PSC+1)/72 000 000
    -》得出 ARR=7200,PSC=0

    然后配置PWM的输出结构体内容即可。

    ARR的值就是我们能输出的最大PWM值。

    占空比的设定:
    输出的CCR值(0~~ARR-1)
    // 占空比P=CCR/(ARR+1)

    详细代码如下:

    my_motor.c

    #include "my_motor.h"
    
    
    
    static void Dir_GPIO_Init(void)
    {
    	
       GPIO_InitTypeDef GPIO_InitStructure;
    
    	
      RCC_APB2PeriphClockCmd(Motor1_Dir_Gpio_Clk, ENABLE); //使能PB端口时钟
      GPIO_InitStructure.GPIO_Pin = Motor1_Dir_Gpio_Pin;	//端口配置
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      //推挽输出
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     //50M
      GPIO_Init(Motor1_Dir_Gpio_Pork, &GPIO_InitStructure);	
    
    	 RCC_APB2PeriphClockCmd(Motor2_Dir_Gpio_Clk, ENABLE); //使能PB端口时钟
      GPIO_InitStructure.GPIO_Pin = Motor2_Dir_Gpio_Pin;	//端口配置
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      //推挽输出
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     //50M
      GPIO_Init(Motor2_Dir_Gpio_Pork, &GPIO_InitStructure);	
    
    	 RCC_APB2PeriphClockCmd(Motor3_Dir_Gpio_Clk, ENABLE); //使能PB端口时钟
      GPIO_InitStructure.GPIO_Pin = Motor3_Dir_Gpio_Pin;	//端口配置
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      //推挽输出
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     //50M
      GPIO_Init(Motor3_Dir_Gpio_Pork, &GPIO_InitStructure);	
    
    	 RCC_APB2PeriphClockCmd(Motor4_Dir_Gpio_Clk, ENABLE); //使能PB端口时钟
      GPIO_InitStructure.GPIO_Pin = Motor4_Dir_Gpio_Pin;	//端口配置
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      //推挽输出
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     //50M
      GPIO_Init(Motor4_Dir_Gpio_Pork, &GPIO_InitStructure);	
    
    }
    
    
    ///*
    // * 注意:TIM_TimeBaseInitTypeDef结构体里面有5个成员,TIM6和TIM7的寄存器里面只有
    // * TIM_Prescaler和TIM_Period,所以使用TIM6和TIM7的时候只需初始化这两个成员即可,
    // * 另外三个成员是通用定时器和高级定时器才有.
    // *-----------------------------------------------------------------------------
    // *typedef struct
    // *{ TIM_Prescaler            都有
    // *	TIM_CounterMode			     TIMx,x[6,7]没有,其他都有
    // *  TIM_Period               都有
    // *  TIM_ClockDivision        TIMx,x[6,7]没有,其他都有
    // *  TIM_RepetitionCounter    TIMx,x[1,8,15,16,17]才有
    // *}TIM_TimeBaseInitTypeDef; 
    // *-----------------------------------------------------------------------------
    // */
    
    /* ----------------   PWM信号 周期和占空比的计算--------------- */
    // ARR :自动重装载寄存器的值
    // CLK_cnt:计数器的时钟,等于 Fck_int / (psc+1) = 72M/(psc+1)
    // PWM 信号的周期 T = ARR * (1/CLK_cnt) = ARR*(PSC+1) / 72M
    // 占空比P=CCR/(ARR+1)
    
    
    static void Pwm_GPIO_Init(void)
    {
    	
       GPIO_InitTypeDef GPIO_InitStructure;
    
    	
      RCC_APB2PeriphClockCmd(Motor1_Pwm_Gpio_Clk, ENABLE); //使能PB端口时钟
      GPIO_InitStructure.GPIO_Pin = Motor1_Pwm_Gpio_Pin;	//端口配置
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      //推挽输出
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     //50M
      GPIO_Init(Motor1_Pwm_Gpio_Pork, &GPIO_InitStructure);	
    
    	 RCC_APB2PeriphClockCmd(Motor2_Pwm_Gpio_Clk, ENABLE); //使能PB端口时钟
      GPIO_InitStructure.GPIO_Pin = Motor2_Pwm_Gpio_Pin;	//端口配置
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      //推挽输出
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     //50M
      GPIO_Init(Motor2_Pwm_Gpio_Pork, &GPIO_InitStructure);	
    
    	 RCC_APB2PeriphClockCmd(Motor3_Pwm_Gpio_Clk, ENABLE); //使能PB端口时钟
      GPIO_InitStructure.GPIO_Pin = Motor3_Pwm_Gpio_Pin;	//端口配置
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      //推挽输出
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     //50M
      GPIO_Init(Motor3_Pwm_Gpio_Pork, &GPIO_InitStructure);	
    
    	 RCC_APB2PeriphClockCmd(Motor4_Pwm_Gpio_Clk, ENABLE); //使能PB端口时钟
      GPIO_InitStructure.GPIO_Pin = Motor4_Pwm_Gpio_Pin;	//端口配置
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      //推挽输出
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     //50M
      GPIO_Init(Motor4_Pwm_Gpio_Pork, &GPIO_InitStructure);	
    }
    
      static void GENERAL_TIM_Mode_Config(void )
     {
    	   // 开启定时器时钟,即内部时钟CK_INT=72M
    	GENERAL_TIM_APBxClock_FUN(GENERAL_TIM_CLK,ENABLE);
    /*--------------------时基结构体初始化-------------------------*/
    	// 配置周期,这里配置为100K
    	
      TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    	// 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
    	TIM_TimeBaseStructure.TIM_Period=GENERAL_TIM_Period;	
    	// 驱动CNT计数器的时钟 = Fck_int/(psc+1)
    	TIM_TimeBaseStructure.TIM_Prescaler= GENERAL_TIM_Prescaler;	
    	// 时钟分频因子 ,配置死区时间时需要用到
    	TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;		
    	// 计数器计数模式,设置为向上计数
    	TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;		
    	// 重复计数器的值,没用到不用管
    	TIM_TimeBaseStructure.TIM_RepetitionCounter=0;	
    	// 初始化定时器
    	TIM_TimeBaseInit(GENERAL_TIM, &TIM_TimeBaseStructure);
    
    
    	/*--------------------输出比较结构体初始化-------------------*/	
    	// 占空比配置
    
    
    	TIM_OCInitTypeDef  TIM_OCInitStructure;
    	// 配置为PWM模式1
    	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    	// 输出使能
    	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    	// 输出通道电平极性配置	
    	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    	
    	
    // 输出比较通道 1
    	TIM_OCInitStructure.TIM_Pulse = 0 ;
    	TIM_OC1Init(GENERAL_TIM, &TIM_OCInitStructure);
    	TIM_OC1PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);
    		
    	// 输出比较通道 2
    	TIM_OCInitStructure.TIM_Pulse =0 ;
    	TIM_OC2Init(GENERAL_TIM, &TIM_OCInitStructure);
    	TIM_OC2PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);
    	
    
    // 输出比较通道 3
    	TIM_OCInitStructure.TIM_Pulse = 0 ;
    	TIM_OC3Init(GENERAL_TIM, &TIM_OCInitStructure);
    	TIM_OC3PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);
    		
    	// 输出比较通道4
    	TIM_OCInitStructure.TIM_Pulse =0 ;
    	TIM_OC4Init(GENERAL_TIM, &TIM_OCInitStructure);
    	TIM_OC4PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);
    	
    		// 使能计数器
    	TIM_Cmd(GENERAL_TIM, ENABLE);
     }
    
     
     void Motor_Init(void )
     {
    	 Dir_GPIO_Init();
    	 Pwm_GPIO_Init();
    	 GENERAL_TIM_Mode_Config();
     }
     
     
     float constrain_float(float amt, float low, float high)
    {
        return ((amt)<(low)?(low):((amt)>(high)?(high):(amt)));
    }
     
    void MotorCtrl(int16_t motor1, int16_t motor2, int16_t motor3, int16_t motor4)
    {
    
        /* 限幅  */
        constrain_float(motor1, -ATOM_PWM_MAX, ATOM_PWM_MAX);
        constrain_float(motor2, -ATOM_PWM_MAX, ATOM_PWM_MAX);
        constrain_float(motor3, -ATOM_PWM_MAX, ATOM_PWM_MAX);
        constrain_float(motor4, -ATOM_PWM_MAX, ATOM_PWM_MAX);
    
             if(0<=motor1) //电机1   正转 设置占空比为 百分之 (1000/TIMER1_PWM_DUTY_MAX*100)
             {
              	GPIO_SetBits(Motor1_Dir_Gpio_Pork,Motor1_Dir_Gpio_Pin);
                TIM_SetCompare1(GENERAL_TIM,motor1);
             }
             else                //电机1   反转
             {
             GPIO_ResetBits(Motor1_Dir_Gpio_Pork,Motor1_Dir_Gpio_Pin);
                  TIM_SetCompare1(GENERAL_TIM,-motor1);
             }
    
             if(0<=motor2) //电机2   正转
             {
              	GPIO_SetBits(Motor2_Dir_Gpio_Pork,Motor2_Dir_Gpio_Pin);
                  TIM_SetCompare2(GENERAL_TIM,motor2);
             }
             else                //电机2   反转
             {
                  GPIO_ResetBits(Motor2_Dir_Gpio_Pork,Motor2_Dir_Gpio_Pin);
                  TIM_SetCompare2(GENERAL_TIM,-motor2);
             }
    
             if(0<=motor3) //电机3   正转
             {
               	GPIO_SetBits(Motor3_Dir_Gpio_Pork,Motor3_Dir_Gpio_Pin);
               TIM_SetCompare3(GENERAL_TIM,motor3);
             }
             else                //电机3   反转
             {
                  GPIO_ResetBits(Motor3_Dir_Gpio_Pork,Motor3_Dir_Gpio_Pin);
               TIM_SetCompare3(GENERAL_TIM,-motor3);
             }
    
             if(0<=motor4) //电机4   正转
             {
               	GPIO_SetBits(Motor4_Dir_Gpio_Pork,Motor4_Dir_Gpio_Pin);
                 TIM_SetCompare4(GENERAL_TIM,motor4);
             }
             else                //电机4   反转
             {
                  GPIO_ResetBits(Motor4_Dir_Gpio_Pork,Motor4_Dir_Gpio_Pin);
                 TIM_SetCompare4(GENERAL_TIM,-motor4);
             }
    }
     
    

    my_motor.h

    #ifndef MY_MOTOR_H
    #define MY_MOTOR_H
    
    
    #include "stm32f10x.h"
    
    /* 控制电机正反转输出引脚*/
    #define Motor1_Dir_Gpio_Clk     RCC_APB2Periph_GPIOC
    #define Motor1_Dir_Gpio_Pork    GPIOC
    #define Motor1_Dir_Gpio_Pin     GPIO_Pin_1
    
    #define Motor2_Dir_Gpio_Clk     RCC_APB2Periph_GPIOC
    #define Motor2_Dir_Gpio_Pork    GPIOC
    #define Motor2_Dir_Gpio_Pin     GPIO_Pin_2
    
    #define Motor3_Dir_Gpio_Clk     RCC_APB2Periph_GPIOC
    #define Motor3_Dir_Gpio_Pork    GPIOC
    #define Motor3_Dir_Gpio_Pin     GPIO_Pin_3
    
    #define Motor4_Dir_Gpio_Clk     RCC_APB2Periph_GPIOC
    #define Motor4_Dir_Gpio_Pork    GPIOC
    #define Motor4_Dir_Gpio_Pin     GPIO_Pin_4
    
    
    
    
    /*PWM波输出引脚*/
    #define Motor1_Pwm_Gpio_Clk     RCC_APB2Periph_GPIOA
    #define Motor1_Pwm_Gpio_Pork    GPIOA
    #define Motor1_Pwm_Gpio_Pin     GPIO_Pin_0
    
    
    #define Motor2_Pwm_Gpio_Clk     RCC_APB2Periph_GPIOA
    #define Motor2_Pwm_Gpio_Pork    GPIOA
    #define Motor2_Pwm_Gpio_Pin     GPIO_Pin_1
    
    
    #define Motor3_Pwm_Gpio_Clk     RCC_APB2Periph_GPIOA
    #define Motor3_Pwm_Gpio_Pork    GPIOA
    #define Motor3_Pwm_Gpio_Pin     GPIO_Pin_2
    
    #define Motor4_Pwm_Gpio_Clk     RCC_APB2Periph_GPIOA
    #define Motor4_Pwm_Gpio_Pork    GPIOA
    #define Motor4_Pwm_Gpio_Pin     GPIO_Pin_3
    
    
    #define ATOM_PWM_MAX 200
    
    
    
    /************通用定时器TIM参数定义,只限TIM2、3、4、5************/
    // 当使用不同的定时器的时候,对应的GPIO是不一样的,这点要注意
    // 我们这里默认使用TIM3
    
    #define            GENERAL_TIM                   TIM5
    #define            GENERAL_TIM_APBxClock_FUN     RCC_APB1PeriphClockCmd
    #define            GENERAL_TIM_CLK               RCC_APB1Periph_TIM5
    #define            GENERAL_TIM_Period             (200-1) 
    #define            GENERAL_TIM_Prescaler         (7200-1)  
     
    
     void Motor_Init(void );
     void MotorCtrl(int16_t motor1, int16_t motor2, int16_t motor3, int16_t motor4);
    
    #endif /*  MY_MOTOR_H */
    
    
    展开全文
  • 这是一个根据温度进行PID控制PWM调速电机的程序代码
  • 浅谈PWM控制电机

    万次阅读 多人点赞 2017-08-30 14:01:47
    先简单说说这几种模式 (1)双极模式,即电枢电压极性是正负交替的, ... 缺点:控制电路复杂。 (2)单极模式,即电机电枢驱动电压极性是单一的  优点:启动快,能加速,刹车,能耗制动,能量反馈
  • STM32——用PWM控制电机

    千次阅读 多人点赞 2021-07-14 17:54:03
    下面是用PWM来驱动电机,涉及的电机驱动是L298N。 大概的思路:初始化连接电机的IO口,配置定时器的PWM模式,配置电机IO口的电平。 代码如下: #include "moto.h" void MOTO_GPIO_Init(void) { /*定义一个GPIO_...
  • 1.PWM(Pulse Width Modulation)即脉冲宽度调制,在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速、开关电源等领域 2.PWM重要参数: 频率 = 1 / TS ...
  • 单片机课程设计完整版《PWM直流电动机调速控制系统》 单片机课程设计完整版《PWM直流电动机调速控制系统》 单片机课程设计完整版《PWM直流电动机调速控制系统》
  • keil软件开发,基于89c52单片机的pwm控制直流电机,通过4*4按键设置pwm值,并且在1620上显示出pwm的值。
  • PWM控制电机.rar

    2019-07-22 16:15:03
    本实验以STM32F103ZET6开发板为基础,使用定时器3、定时器4的通道3和通道4分别控制4路PWM输出,实现直流电机的驱动
  • STM32F429使用PWM控制电机转速

    万次阅读 多人点赞 2019-02-25 13:44:40
    实验主要是通过对定时器3的通道3和通道4的配置来实现PWM的输出,并且可以通过调整占空比来实现对电机转速的控制。 实验前准备 本次实验需要用到的器材有:STM32F429开发板、两路减速电机、L298N电机驱动模块、...
  • 51单片机控制直流电机PWM调速C语言程序
  • STM32定时器输出PWM控制电机

    千次阅读 2021-01-15 15:34:19
    利用已经建立的工程模板,在Keil for ARM V5中编写代码,实现如下功能:配置定时器1输出PWM,通过输出不同的占空比的PWM控制电机的转动速度。 main.c: #include "stm32f10x.h" #include "time.h" #include "motor....
  • 基于51单片机的直流电机转速设计,含详细步骤及代码
  • PWM控制直流电机调速

    千次阅读 2020-12-23 15:14:28
    PWM控制技术广泛地应用于开关稳压电源,不间断电源(UPS),以及交直流电动机传动等领。本文阐述了PWM变频调速系统的基本原理和特点,并在此基础上给出了一种基于MitelSA866DE三相PWM波形发生器和绝缘栅双极功率晶体管...
  • 本篇文章我将针对PWM控制电机与编码器读取电机转速的STM32CubeMX配置过程进行详细的讲解,让准备学习HAL库的小伙伴能够更好的理解STM32CubeMX如何配置。 有小伙伴对于电机驱动和编码器不懂的话请看: 电机驱动讲解:...
  • 本文主要讲了51单片机控制PWM信号实现直流电机转速控制的方法,希望对你的学习有所帮助。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,066
精华内容 5,226
关键字:

pwm控制电机

友情链接: ccrpTmr6.zip