OpenEdv-开源电子网

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

大神们求助啊,想用mini stm32里面的PWM例程控制舵机的正反转

[复制链接]

3

主题

12

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-4-13
在线时间
5 小时
发表于 2016-4-13 17:56:33 | 显示全部楼层 |阅读模式

想用mini stm32里面的PWM例程控制舵机的正反转,可以实现吗?例程是用定时器的占空比写的程序,不是很能理解,给个建议怎么改。谢谢啦。下面代码是例程的主函数

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "pwm.h"


int main(void)
{       
        u16 led0pwmval=0;   
        u8 dir=1;       
        delay_init();                     //延时函数初始化          
        LED_Init();                          //
        TIM1_PWM_Init(899,0);//不分频,PWM频率=72000/(899+1)=80Khz
while(1)
        {
                delay_ms(10);
                if(dir)led0pwmval++;
                else led0pwmval--;
         
                if(led0pwmval>300)dir=0;
                if(led0pwmval==0)dir=1;       
                               
                TIM_SetCompare1(TIM1,led0pwmval);               
        }

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

794

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
1502
金钱
1502
注册时间
2015-3-3
在线时间
460 小时
发表于 2016-4-13 18:23:16 | 显示全部楼层
回复 支持 反对

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2016-4-11
在线时间
13 小时
发表于 2016-4-13 18:26:48 | 显示全部楼层
  TIM1_PWM_Init(899,0);//不分频,PWM频率=72000/(899+1)=80Khz
回复 支持 反对

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2016-4-11
在线时间
13 小时
发表于 2016-4-13 18:35:01 | 显示全部楼层
#include "stm32f10x.h" #include "pwm.h" int main() {          u8 a;                  TIM1_PWM_Init(899,1999);         //2»·ÖÆμ¡£PWMÆμÂê=72000000/900=80Khz/2000=40HZ         TIM_SetCompare2(TIM1,a);        //¸Ä±äaμÄÖμ¾íÄü¿ØÖƶæ»úÕy·′×aáË£¬aè¡ÖμÔú40μ½200Ö®¼ä  }
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-4-13
在线时间
5 小时
 楼主| 发表于 2016-4-13 19:24:12 | 显示全部楼层
筱雨落客 发表于 2016-4-13 18:26
TIM1_PWM_Init(899,0);//不分频,PWM频率=72000/(899+1)=80Khz

啊??、
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-4-13
在线时间
5 小时
 楼主| 发表于 2016-4-13 19:26:19 | 显示全部楼层
筱雨落客 发表于 2016-4-13 18:35
#include "stm32f10x.h" #include "pwm.h" int main() {          u8 a;                  TIM1_PWM_Init(899,1999);         //2» ...

能稍微解释一下吗 谢谢了
回复 支持 反对

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2016-4-11
在线时间
13 小时
发表于 2016-4-13 19:36:36 | 显示全部楼层
hongzhiyong 发表于 2016-4-13 19:26
能稍微解释一下吗 谢谢了

舵机接收控制信号,根据控制信号的脉冲宽度,也就是高电平时间输出角度,一般的舵机的接收信号能接收的信号的频率不能太高,反正我使用40HZ,撇一点的舵机都能用,那里PWM_init这里,就需要输出40HZ的PWM波,
回复 支持 反对

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2016-4-11
在线时间
13 小时
发表于 2016-4-14 08:41:45 | 显示全部楼层
hongzhiyong 发表于 2016-4-13 19:26
能稍微解释一下吗 谢谢了

就是把PWM波的周期降低到40HZ可以让舵机接收的样子TIM3_PWM_Init(899,2000);这里72M/900/2000=40HZ,然后就是控制PWM的脉冲宽度在0.5-2.5ms之内TIM_SetCompare2(TIM3,120);这里(120/2000)*25ms=1.5ms,也就是人舵机处于中间状态,要让他正反转,就改变后面的120那个数字就行了。
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-4-13
在线时间
5 小时
 楼主| 发表于 2016-4-14 19:40:47 | 显示全部楼层
筱雨落客 发表于 2016-4-14 08:41
就是把PWM波的周期降低到40HZ可以让舵机接收的样子TIM3_PWM_Init(899,2000);这里72M/900/2000=40HZ,然后 ...

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "pwm.h"


int main(void)
{        
        u16 led0pwmval=0;   
        u8 dir;        
        delay_init();                     //延时函数初始化         
        LED_Init();                          //
        TIM1_PWM_Init(899,2000);//不分频,PWM频率=72000/(900)/2000=80Khz
while(1)
        {
                delay_ms(10);

                 if(dir)led0pwmval++;
                else led0pwmval--;
         
                if(led0pwmval>300)dir=0;
                if(led0pwmval==0)dir=1;      
                                
                TIM_SetCompare1(TIM1,led0pwmval);
                TIM_SetCompare2(TIM3,120);               
        }

这样?  感觉有点奇怪
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-4-13
在线时间
5 小时
 楼主| 发表于 2016-4-14 19:42:26 | 显示全部楼层
筱雨落客 发表于 2016-4-14 08:41
就是把PWM波的周期降低到40HZ可以让舵机接收的样子TIM3_PWM_Init(899,2000);这里72M/900/2000=40HZ,然后 ...

要用到两次定时器是吗?  有什么完整的工程 发我以一个可以吗 谢谢了
邮箱710772586@qq.com
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-4-13
在线时间
5 小时
 楼主| 发表于 2016-4-14 21:05:41 | 显示全部楼层
筱雨落客 发表于 2016-4-14 08:41
就是把PWM波的周期降低到40HZ可以让舵机接收的样子TIM3_PWM_Init(899,2000);这里72M/900/2000=40HZ,然后 ...

我用的是mini板的,不是旗舰版的。
我把mini版的PWM例程的主函数换成你给我的,然后把TIM3换成TIM1,
TIM1_PWM_Init(899,1999) ;  TIM_SetCompare1(TIM1,a)  换了这两条。  
最后TIM_SetCompare1(TIM1,a)  里面的a我随便给个数据例如40,,烧进去舵机不转。。
我哪里弄错了吗
回复 支持 反对

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2016-4-11
在线时间
13 小时
发表于 2016-4-14 21:29:58 | 显示全部楼层
hongzhiyong 发表于 2016-4-14 21:05
我用的是mini板的,不是旗舰版的。
我把mini版的PWM例程的主函数换成你给我的,然后把TIM3换成TIM1,
T ...

加我QQ:1349476347
回复 支持 反对

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2016-4-11
在线时间
13 小时
发表于 2016-4-14 21:31:16 | 显示全部楼层

我也不知道具体是啥情况,如果你有示波器,可以用示波器先看一下波形合适不
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 13:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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