OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5601|回复: 8

PWM波控制直流电机的问题

[复制链接]

11

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2015-11-23
在线时间
12 小时
发表于 2016-9-12 18:37:13 | 显示全部楼层 |阅读模式
1金钱
STM32用PWM控制直流电机,产生不同的速度,程序如何写?想找一个简单点的,就是控制速度,不需要反馈调节!找了好多,没有看懂,求大神给一个简单的啊!

最佳答案

查看完整内容[请看2#楼]

问题已经解决!现把代码附上: int main(void) { TB6612FNG_Init(); // GPIO_TimPWM(); TIM4_Configuration(7199,0); WriteDO( MOTOR_PORT, MOTOR_PIN_1A, 1); WriteDO( MOTOR_PORT, MOTOR_PIN_1B, 0); WriteDO( MOTOR_PORT, MOTOR_PIN_2A, 1); WriteDO( MOTOR_PORT, MOTOR_PIN_2B, 0); while(1) { TIM_SetCompare3(TIM4,3600); TIM_SetCompare4(TIM4,5400); } ; } void TIM4_Configuration ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2015-11-23
在线时间
12 小时
 楼主| 发表于 2016-9-12 18:37:14 | 显示全部楼层
问题已经解决!现把代码附上:
int main(void)
{
        TB6612FNG_Init();
//        GPIO_TimPWM();
        TIM4_Configuration(7199,0);
        WriteDO( MOTOR_PORT, MOTOR_PIN_1A, 1);
        WriteDO( MOTOR_PORT, MOTOR_PIN_1B, 0);
        WriteDO( MOTOR_PORT, MOTOR_PIN_2A, 1);
        WriteDO( MOTOR_PORT, MOTOR_PIN_2B, 0);
  while(1)
  {
                TIM_SetCompare3(TIM4,3600);       
                TIM_SetCompare4(TIM4,5400);       
  } ;
}

void TIM4_Configuration(u16 arr,u16 psc)
{
       
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);//使能GPIOB
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);  //使能TIM4
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9; //TIM_CH1 //TIM_CH4      
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);        //不解释
       
        //假如我要产生50Hz占空比为50%的PWM波,方便控制舵机
        //设置方法:
        //系统默认时钟为72MHz,预分频71+1次,得到TIM4计数时钟为1MHz
        //计数长度为19999+1=20000,可得PWM频率为1M/20000=50Hz
        //具体设置可参考上面的设置方法,简单明了!

        TIM_TimeBaseStructure.TIM_Prescaler = psc;//网上多数设置有误
        TIM_TimeBaseStructure.TIM_Period = arr;  
        TIM_TimeBaseStructure.TIM_ClockDivision = 0;  
//        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:  TIM_CKD_DIV1 = 0,PWM波不延时(延时破坏占空比?待考证)
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式

        TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);  
        TIM_ARRPreloadConfig(TIM4, DISABLE);  //禁止ARR预装载缓冲器,也可以不用设置

        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能

        //占空比设置方法:
        //占空比=(TIM_Pulse+1)/(TIM_Pulse+1)-(TIM_Period+1)=10000/20000=0.5=50%

        TIM_OCInitStructure.TIM_Pulse = 1-1;     
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
        TIM_OC3Init(TIM4, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
        TIM_OC4Init(TIM4, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
        TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);  //使能TIMx在CCR3上的预装载寄存器,定时器4的通道3
        TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);  //使能TIMx在CCR4上的预装载寄存器,定时器4的通道4
        //上面两句中的OC2确定了是channle几,要是OC3则是channel 3  

        TIM_CtrlPWMOutputs(TIM4,ENABLE);   //设置TIM2的PWM输出为使能
        TIM_ARRPreloadConfig(TIM4, ENABLE); //使能TIMx在ARR上的预装载寄存器
        TIM_Cmd(TIM4, ENABLE);  //使能TIMx外设
}
回复

使用道具 举报

7

主题

57

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
270
金钱
270
注册时间
2015-12-11
在线时间
42 小时
发表于 2016-9-12 20:22:10 | 显示全部楼层
原子写好的程序,调用就可以了。
初始化,和调占空比
回复

使用道具 举报

11

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2015-11-23
在线时间
12 小时
 楼主| 发表于 2016-9-12 22:37:34 | 显示全部楼层
爱吃排骨的蛋炒饭 发表于 2016-9-12 20:22
原子写好的程序,调用就可以了。
初始化,和调占空比

在哪里有啊?只有一个LED的亮度调节,没看到转么针对直流电机 的!求帮助啊,谢谢了!
回复

使用道具 举报

1

主题

57

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2015-11-4
在线时间
72 小时
发表于 2016-9-12 23:22:56 | 显示全部楼层

调不同的占空比,就会产生不同的转速。

调不同的占空比,就会产生不同的转速。

回复

使用道具 举报

1

主题

57

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2015-11-4
在线时间
72 小时
发表于 2016-9-12 23:26:59 | 显示全部楼层
灯的亮度调节就通过TIM_SetCompare1(TIM1,led0pwmval)这个设置的,改变占空比,就可以产生不一样的转速了,一样道理的.
回复

使用道具 举报

11

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2015-11-23
在线时间
12 小时
 楼主| 发表于 2016-9-13 18:17:33 | 显示全部楼层
乐仔 发表于 2016-9-12 23:26
灯的亮度调节就通过TIM_SetCompare1(TIM1,led0pwmval)这个设置的,改变占空比,就可以产生不一样的转速了, ...

搞定了,谢谢!是自己不够细心,配置出了问题!
回复

使用道具 举报

1

主题

57

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2015-11-4
在线时间
72 小时
发表于 2016-9-13 20:19:21 | 显示全部楼层
谢谢分享
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2021-3-16
在线时间
29 小时
发表于 2016-9-18 10:36:52 | 显示全部楼层
楼主WriteDO( MOTOR_PORT, MOTOR_PIN_1A, 1);这个函数是用来初始化驱动芯片使能脚的吗?   我在用l6206驱动芯片,不知道接法不对还是什么,电机转得很慢,还有就是PWM波输出电平不应该是0v吗,我的是1.4,高电平时3.3
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-25 08:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表