OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...
查看: 10576|回复: 12

求教怎么用PWM精确输出脉冲数控制步进电机的转动

[复制链接]

  离线 

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2015-4-2
在线时间
7 小时
发表于 2016-4-30 12:38:30 | 显示全部楼层 |阅读模式
1金钱

求求各位帮帮忙,我们是真没时间了,就卡在这里,马上就要比赛了但是这个搞不定...........我也是半路出家才搞了两个星期,能正常输出pwm但是确定脉冲数真的不行了。求给代码,F4的板子,我也不想伸手的,可是5月3日就校内比赛了,对不起各位求求帮帮忙,现在就差这块了

最佳答案

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

http://www.openedv.com/thread-41832-1-1.html
回复

使用道具 举报

  离线 

3

主题

2108

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
3913
金钱
3913
注册时间
2013-11-22
在线时间
715 小时
发表于 2016-4-30 12:38:31 | 显示全部楼层
回复

使用道具 举报

  离线 

7

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
745
金钱
745
注册时间
2016-1-20
在线时间
78 小时
发表于 2016-4-30 13:09:30 | 显示全部楼层
利用外部中断计数来知道你的脉冲数。
比如说你的PA0用来输出PWm脉冲。把PA0和PA1短接在一起(条件允许中间也可以接一个电阻),PA1使用外部中断上升沿触发,这样一个脉冲就会进入一次中断。在中断中你可以知道脉冲出现的次数的。你说的这些描述,没有贴代码,别人给不了你代码,给了不一定实用。看我给你说的方法你是否可以操作。(这个操作简单计数准,但是你必须可以修改硬件)
假设你不能短接,你做一个和PWM同频率的定时器。用定时器来计算PWM输出多少个周期了。(计数可能有偏差,但程序逻辑控制的好可以做到没有偏差)
或许STM32内部有可以计数的,但是我不会。(你请教一下高手吧)
另外,你是那个学校的?
祝你比赛拿到好成绩!
回复

使用道具 举报

  离线 

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2015-4-2
在线时间
7 小时
 楼主| 发表于 2016-4-30 13:20:29 | 显示全部楼层
footprint 发表于 2016-4-30 13:09
利用外部中断计数来知道你的脉冲数。
比如说你的PA0用来输出PWm脉冲。把PA0和PA1短接在一起(条件允许中间 ...

谢谢我试试看,我们是上大的, 马上要参加机械创新大赛了,先校内选拔再去,我们做好了三轴移动平台准备做钱币分类。我当时也是失策了,我们小组全是机械的,我也是机械生,不过当年参加飞思卡尔智能车有点基础........结果程序都得我来...........所以我压力特别大,还不停地遇到各种各样的麻烦(昨天是matlab与stm32的串口收发问题.......)
回复

使用道具 举报

  离线 

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2015-4-2
在线时间
7 小时
 楼主| 发表于 2016-4-30 13:24:15 | 显示全部楼层
footprint 发表于 2016-4-30 13:09
利用外部中断计数来知道你的脉冲数。
比如说你的PA0用来输出PWm脉冲。把PA0和PA1短接在一起(条件允许中间 ...

我之前使用TIM3定时器,想在里面设置个中断,在中断中计数控制脉冲个数,根本不行,停不下来
回复

使用道具 举报

  离线 

7

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
745
金钱
745
注册时间
2016-1-20
在线时间
78 小时
发表于 2016-4-30 13:38:33 | 显示全部楼层
勇者j 发表于 2016-4-30 13:24
我之前使用TIM3定时器,想在里面设置个中断,在中断中计数控制脉冲个数,根本不行,停不下来

计数的数据你得到了吗?是什么停不下来?
回复

使用道具 举报

  离线 

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2015-4-2
在线时间
7 小时
 楼主| 发表于 2016-4-30 13:59:14 | 显示全部楼层
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "timer.h"


//ALIENTEK ̽Ë÷ÕßSTM32F407¿ª·¢°å ʵÑé10
//ÊäÈ벶»ñʵÑé -¿âº¯Êý°æ±¾
//¼¼ÊõÖ§³Ö£ºwww.openedv.com
//ÌÔ±¦µêÆÌ£ºhttp://eboard.taobao.com  
//¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾  
//×÷ÕߣºÕýµãÔ­×Ó @ALIENTEK



extern u8  TIM5CH1_CAPTURE_STA;                //ÊäÈ벶»ñ״̬                                                   
extern u32        TIM5CH1_CAPTURE_VAL;        //ÊäÈ벶»ñÖµ  
  u32 run_com=3200*5;
        u32 run_cnt=0;
int main(void)
{
        long long temp=0;  
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//ÉèÖÃϵͳÖжÏÓÅÏȼ¶·Ö×é2
        delay_init(168);  //³õʼ»¯ÑÓʱº¯Êý
        uart_init(115200);//³õʼ»¯´®¿Ú²¨ÌØÂÊΪ115200
       
        TIM3_PWM_Init(1000-1,84-1);               //84M/84=1MhzµÄ¼ÆÊýƵÂʼÆÊýµ½500,PWMƵÂÊΪ1M/500=2Khz     
        TIM5_CH1_Cap_Init(0XFFFFFFFF,84-1); //ÒÔ1MhzµÄƵÂʼÆÊý
           while(1)
        {
                delay_ms(10);
                TIM_SetCompare1(TIM14,150);
                if(TIM5CH1_CAPTURE_STA&0X80)        //³É¹¦²¶»ñµ½ÁËÒ»´Î¸ßµçƽ
                {
                        temp=TIM5CH1_CAPTURE_STA&0X3F;
                        temp*=0XFFFFFFFF;                                          //Òç³öʱ¼ä×ܺÍ
                        temp+=TIM5CH1_CAPTURE_VAL;                   //µÃµ½×ܵĸߵçƽʱ¼ä
                        printf("HIGH:%lld us\r\n",temp); //´òÓ¡×ܵĸߵãƽʱ¼ä
                        run_cnt++;
                        if(run_cnt==run_com)TIM_Cmd(TIM3,DISABLE);
                        TIM5CH1_CAPTURE_STA=0;                             //¿ªÆôÏÂÒ»´Î²¶»ñ
                       
                }
        }
}
捕获到了,但是停不下来
回复

使用道具 举报

  离线 

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2015-4-2
在线时间
7 小时
 楼主| 发表于 2016-4-30 15:52:16 | 显示全部楼层
footprint 发表于 2016-4-30 13:38
计数的数据你得到了吗?是什么停不下来?

用捕获的方法成功了,谢谢大神。还有个问题,我现在想用按钮打开定时器,但是不行,代码如下
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "timer.h"
#include "key.h"


//ALIENTEK ̽Ë÷ÕßSTM32F407¿ª·¢°å ʵÑé10
//ÊäÈ벶»ñʵÑé -¿âº¯Êý°æ±¾
//¼¼ÊõÖ§³Ö£ºwww.openedv.com
//ÌÔ±¦µêÆÌ£ºhttp://eboard.taobao.com  
//¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾  
//×÷ÕߣºÕýµãÔ­×Ó @ALIENTEK



extern u8  TIM5CH1_CAPTURE_STA;                //ÊäÈ벶»ñ״̬                                                   
extern u32        TIM5CH1_CAPTURE_VAL;        //ÊäÈ벶»ñÖµ  
u32 run_cnt=1;
int main(void)
{
        u8 key;
        long long temp=0;  
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//ÉèÖÃϵͳÖжÏÓÅÏȼ¶·Ö×é2
        delay_init(168);  //³õʼ»¯ÑÓʱº¯Êý
        uart_init(115200);//³õʼ»¯´®¿Ú²¨ÌØÂÊΪ115200
        KEY_Init();
       
        TIM3_PWM_Init(20000-1,7-1);               //84M/84=1MhzµÄ¼ÆÊýƵÂʼÆÊýµ½500,PWMƵÂÊΪ1M/500=2Khz   
TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,DISABLE);       
        TIM5_CH1_Cap_Init(0XFFFFFFFF,84-1); //ÒÔ1MhzµÄƵÂʼÆÊý
        TIM_SetCompare1(TIM3,150);
       
   while(1)
        {
                key=KEY_Scan(0);
                switch(key)
                 {
                         case KEY0_PRES:
                                 run_cnt=0;
                         TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);       
                         TIM_Cmd(TIM5,ENABLE);
                         TIM_Cmd(TIM3,ENABLE);
                         while(run_cnt<=312)
                         {
                         if(TIM5CH1_CAPTURE_STA&0X80)
                         {
                                   run_cnt++;
                                          temp=TIM5CH1_CAPTURE_STA&0X3F;
                             temp*=0XFFFFFFFF;                                          //Òç³öʱ¼ä×ܺÍ
                             temp+=TIM5CH1_CAPTURE_VAL;                   //µÃµ½×ܵĸߵçƽʱ¼ä
                             printf("HIGH:%lld us\r\n",temp); //´òÓ¡×ܵĸߵãƽʱ¼ä
                             TIM5CH1_CAPTURE_STA=0;                             //¿ªÆôÏÂÒ»´Î²¶»ñ
                         }
                         }
                         TIM_Cmd(TIM3,DISABLE);
                         TIM_Cmd(TIM5,DISABLE);
                          TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,DISABLE);       
                         break;
                 }

        }
}
回复

使用道具 举报

  离线 

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2015-4-2
在线时间
7 小时
 楼主| 发表于 2016-4-30 15:53:28 | 显示全部楼层
我再发一遍有乱码

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "timer.h"
#include "key.h"



extern u8  TIM5CH1_CAPTURE_STA;                                                   
extern u32        TIM5CH1_CAPTURE_VAL;       
u32 run_cnt=1;
int main(void)
{
        u8 key;
        long long temp=0;  
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        delay_init(168);  
        uart_init(115200);
        KEY_Init();
       
        TIM3_PWM_Init(20000-1,7-1);              
TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,DISABLE);       
        TIM5_CH1_Cap_Init(0XFFFFFFFF,84-1);
        TIM_SetCompare1(TIM3,150);
       
   while(1)
        {
                key=KEY_Scan(0);
                switch(key)
                 {
                         case KEY0_PRES:
                                 run_cnt=0;
                         TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);       
                         TIM_Cmd(TIM5,ENABLE);
                         TIM_Cmd(TIM3,ENABLE);
                         while(run_cnt<=312)
                         {
                         if(TIM5CH1_CAPTURE_STA&0X80)
                         {
                                   run_cnt++;
                                          temp=TIM5CH1_CAPTURE_STA&0X3F;
                             temp*=0XFFFFFFFF;                                      
                             temp+=TIM5CH1_CAPTURE_VAL;               
                             printf("HIGH:%lld us\r\n",temp);
                             TIM5CH1_CAPTURE_STA=0;                         
                         }
                         }
                         TIM_Cmd(TIM3,DISABLE);
                         TIM_Cmd(TIM5,DISABLE);
                          TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,DISABLE);       
                         break;
                 }

        }
}
回复

使用道具 举报

  离线 

19

主题

356

帖子

0

精华

高级会员

Rank: 4

积分
550
金钱
550
注册时间
2016-4-7
在线时间
79 小时
发表于 2016-4-30 17:02:44 | 显示全部楼层
勇者j 发表于 2016-4-30 13:24
我之前使用TIM3定时器,想在里面设置个中断,在中断中计数控制脉冲个数,根本不行,停不下来

中断里设置一个标志位,然后设一个变量,每中断一次变量+1,电机要启动前变量清零,开标志位,变量到的你需要的参数时候标志位清除,使能关,时钟关不关看你程序了,电机就停了
回复

使用道具 举报

  离线 

7

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
745
金钱
745
注册时间
2016-1-20
在线时间
78 小时
发表于 2016-5-3 08:16:04 | 显示全部楼层
勇者j 发表于 2016-4-30 15:53
我再发一遍有乱码

#include "sys.h"

这几天放假了,没在公司。你把关断的部分放在你的捕获的中断里面。我不知道你键盘检测如何写的,但我觉得如果你一直按着按键不丢,也许在某一个时刻可以关掉。可能是逻辑上的一点问题,但也不敢十分确定,只有做了实验我才能确定!
回复

使用道具 举报

  离线 

0

主题

1

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2017-10-10
在线时间
0 小时
发表于 2017-12-2 15:57:13 | 显示全部楼层
很酷,晚上试试
回复

使用道具 举报

  离线 

113

主题

216

帖子

0

精华

高级会员

Rank: 4

积分
683
金钱
683
注册时间
2016-5-19
在线时间
164 小时
发表于 2018-6-14 20:28:04 | 显示全部楼层
先看看,学习了.
回复

使用道具 举报

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

本版积分规则




关闭

必看,必学:"原子哥”力荐上一条 /1 下一条

正点原子公众号

QQ|联系我们|手机版|官方淘宝店|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-9-23 22:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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