OpenEdv-开源电子网

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

请教一个如何准确输出PWM脉冲个数的方法

[复制链接]

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2017-3-22
在线时间
8 小时
发表于 2017-8-18 10:21:27 | 显示全部楼层 |阅读模式
我现在想要控制步进电机,那么就需要准确的控制PWM的脉冲个数,,请问如何能准确控制PWM脉冲个数呢?
我现在的想法是,使用STM32的捕获比较,输出PWM波,每次定时器溢出时,计数+1,然后达到目标个数时候,关闭定时器;请问还有什么更好的方法吗?
#include "pwm.h"
#include "stm32f10x.h"

#define LED0 PBout(5)// PB5
#define LED1 PEout(5)// PE5       

int i=0,j=60000;

void pwm_init(u16 arr,u16 pre)
{
        GPIO_InitTypeDef GPIO_Initstrue;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitstrue;
        TIM_OCInitTypeDef TIM_OCInitstrue;
        NVIC_InitTypeDef NVIC_InitTypestrue;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);  
                       
        GPIO_Initstrue.GPIO_Pin = GPIO_Pin_5;                                 //LED0-->PB.5 端口配置
        GPIO_Initstrue.GPIO_Mode = GPIO_Mode_AF_PP;                  //推挽输出
        GPIO_Initstrue.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
        GPIO_Init(GPIOB, & GPIO_Initstrue);                                        //根据设定参数初始化GPIOB.5

        GPIO_Initstrue.GPIO_Pin = GPIO_Pin_5;                                 //LED0-->PB.5 端口配置
        GPIO_Initstrue.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
        GPIO_Initstrue.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
        GPIO_Init(GPIOE, & GPIO_Initstrue);                                        //根据设定参数初始化GPIOE.5
       
       
        GPIO_SetBits(GPIOB,GPIO_Pin_5);                                                 //PB.5 输出高

        GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);
       
        TIM_TimeBaseInitstrue.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBaseInitstrue.TIM_Period=arr;
        TIM_TimeBaseInitstrue.TIM_Prescaler=pre;
        TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitstrue);
       
        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
       
        GPIO_ResetBits(GPIOE ,GPIO_Pin_5);
       
        NVIC_InitTypestrue.NVIC_IRQChannel=TIM3_IRQn;
        NVIC_InitTypestrue.NVIC_IRQChannelCmd=ENABLE;
        NVIC_InitTypestrue.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_InitTypestrue.NVIC_IRQChannelSubPriority=3;
        NVIC_Init(&NVIC_InitTypestrue);
       
        TIM_OCInitstrue.TIM_OCMode = TIM_OCMode_PWM2;                           //选择 PWM 模式 2
        TIM_OCInitstrue.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitstrue.TIM_OCPolarity = TIM_OCPolarity_High;           //输出极性高
        TIM_OC2Init(TIM3,&TIM_OCInitstrue);
       
        TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);
        TIM_Cmd(TIM3,ENABLE);       
       
}


void TIM3_IRQHandler(void)
{
        if(TIM_GetFlagStatus(TIM3,TIM_IT_Update)==SET)
        {
                i++;
                if(i==j)
                {
                        //GPIO_ResetBits(GPIOE ,GPIO_Pin_5);
                        LED1=!LED1;
                        i=0;
                        //TIM_Cmd(TIM3,DISABLE);               
                }
                TIM_ClearITPendingBit(TIM3, TIM_IT_Update);  //清除TIMx更新中断标志               
        }
}

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

使用道具 举报

1

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2017-8-4
在线时间
13 小时
发表于 2017-8-19 09:54:33 | 显示全部楼层
C:\Users\Dunk\Desktop\HWILE
C:\Users\Dunk\Desktop\TIMER
HWILE.png
TIMER.png
回复 支持 1 反对 0

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2017-3-22
在线时间
8 小时
 楼主| 发表于 2017-8-18 10:22:03 | 显示全部楼层
求指教,我也是捣鼓好几天了,还没有好
回复 支持 反对

使用道具 举报

24

主题

257

帖子

0

精华

高级会员

Rank: 4

积分
771
金钱
771
注册时间
2017-2-19
在线时间
133 小时
发表于 2017-8-18 15:27:18 | 显示全部楼层
你用示波器测试你输出波形的个数了吗?   
回复 支持 反对

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2017-3-22
在线时间
8 小时
 楼主| 发表于 2017-8-19 08:09:04 | 显示全部楼层
刘东君 发表于 2017-8-18 15:27
你用示波器测试你输出波形的个数了吗?

那还没有
回复 支持 反对

使用道具 举报

10

主题

158

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2017-4-20
在线时间
102 小时
发表于 2017-8-19 08:45:34 | 显示全部楼层
主从模式
回复 支持 反对

使用道具 举报

1

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2017-8-4
在线时间
13 小时
发表于 2017-8-19 09:57:03 | 显示全部楼层
输出PWM部分照常来,数个问题交给定时器,看你PWM的周期,想要多少个就多少个周期,时间到了就把占空比调到满值就行了
回复 支持 反对

使用道具 举报

12

主题

241

帖子

0

精华

高级会员

Rank: 4

积分
806
金钱
806
注册时间
2017-8-17
在线时间
159 小时
发表于 2017-8-24 13:25:42 | 显示全部楼层
mark  
回复 支持 反对

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2017-3-22
在线时间
8 小时
 楼主| 发表于 2017-8-25 22:19:07 | 显示全部楼层

啥主从模式呀?
回复 支持 反对

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2017-3-22
在线时间
8 小时
 楼主| 发表于 2017-8-25 22:21:19 | 显示全部楼层

谢谢老铁,不过,我还遇到一个问题,STM32断电在重新上电的时候,程序会连续运行几次,复位以后就是,每复位运行一次是怎么回事?可明白我的意思?
回复 支持 反对

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2017-3-22
在线时间
8 小时
 楼主| 发表于 2017-8-25 22:21:42 | 显示全部楼层
热i 发表于 2017-8-19 09:57
输出PWM部分照常来,数个问题交给定时器,看你PWM的周期,想要多少个就多少个周期,时间到了就把占空比调到 ...

恩,就是时间到,关定时器对不对?
回复 支持 反对

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2017-3-22
在线时间
8 小时
 楼主| 发表于 2017-8-25 22:23:27 | 显示全部楼层
大家好,我遇到一个新问题,就是STM32上电以后,电机就是会转--停---转----几次,强制复位以后,就是每次复位只转一次了;这个怎么回事?上电以后单片机不稳定啊,跑飞了?还是?
回复 支持 反对

使用道具 举报

10

主题

158

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2017-4-20
在线时间
102 小时
发表于 2017-8-26 10:06:01 | 显示全部楼层
初始化问题   
回复 支持 反对

使用道具 举报

1

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2017-8-4
在线时间
13 小时
发表于 2017-8-26 11:37:01 | 显示全部楼层
VU情 发表于 2017-8-25 22:21
谢谢老铁,不过,我还遇到一个问题,STM32断电在重新上电的时候,程序会连续运行几次,复位以后就是,每 ...

不太清楚哎,看看定时器的设置是否正确吧
回复 支持 反对

使用道具 举报

1

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2017-8-4
在线时间
13 小时
发表于 2017-8-26 11:37:46 | 显示全部楼层
VU情 发表于 2017-8-25 22:21
恩,就是时间到,关定时器对不对?

时间到了关PWM,定时器是更新中断,不用管
回复 支持 反对

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2017-3-22
在线时间
8 小时
 楼主| 发表于 2017-8-26 13:37:18 | 显示全部楼层

应该怎么初始化呢
回复 支持 反对

使用道具 举报

10

主题

158

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2017-4-20
在线时间
102 小时
发表于 2017-8-26 13:44:41 | 显示全部楼层
http://www.openedv.com/forum.php?mod=viewthread&tid=100333      这个是主从 我的是STM32F103的  
  你看着改
回复 支持 反对

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2017-3-22
在线时间
8 小时
 楼主| 发表于 2017-8-26 13:47:33 | 显示全部楼层
564646396 发表于 2017-8-26 13:44
http://www.openedv.com/forum.php?mod=viewthread&tid=100333      这个是主从 我的是STM32F103的  
  你 ...

谢谢啦,再请教一个问题,串口助手发送的数据,如何直接拿来用啊?就是可以当做数值进行计算的
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-15 16:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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