STM32用PWM实现步进电机的正反转

2019-08-22来源: eefocus关键字:STM32  PWM  步进电机  正反转

2019年7月23日

做小车的第三天。

利用可调的PWM脉冲实现步进电机的正反转,思路大致是:利用TIM3(STM32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出)的两个通道输出两道PWM脉冲,控制电机的高低电平以实现电机的正反转。

代码如下:

#ifndef __TIMER_H

#define __TIMER_H

#include “sys.h”

/****************************************************

在下面的宏定义中 作用是起一个连接语句的作用意思是用 IN(a) 代表后面的if else语句。

#define IN1(a) if (a) 

GPIO_SetBits(GPIOA,GPIO_Pin_6);

else 

TIM_SetCompare1(TIM3,6000)

#define IN2(a) if (a) 

GPIO_SetBits(GPIOA,GPIO_Pin_7);

else 

TIM_SetCompare2(TIM3,6000);

/

void TIM3_Int_Init(u16 arr,u16 psc);

void TIM3_PWM_Init(u16 arr,u16 psc);

#endif

//

void TIM3_PWM_Init(u16 arr,u16 psc)

{

GPIO_InitTypeDef GPIO_InitStructure;

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

TIM_OCInitTypeDef TIM_OCInitStruct;

/************************************************

使能TIM3 以及配置相应的IO口(通道)PA6(通道1) PA7(通道2)

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);


GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_Init(GPIOA,&GPIO_InitStructure);

/

TIM_TimeBaseInitStructure.TIM_Period=arr;//配置定时器的重装载值

TIM_TimeBaseInitStructure.TIM_Prescaler=psc;//配置预分频系数

TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;

TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;

TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);

/*********

两个通道均采用PWM2模式(CCPx比arr大为有效)并且设置为High 有效为高电平

TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM2;

TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;

TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;

TIM_OC1Init(TIM3,&TIM_OCInitStruct);

TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);

TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM2;

TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;

TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;

TIM_OC2Init(TIM3,&TIM_OCInitStruct);

TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);

*****************************************************************/

TIM_Cmd(TIM3,ENABLE);

}

/*******/

void Motor_1_STOP(void)

{

IN1(1);

IN2(1);

}

void Motor_1_PRun(void) //正转

{

IN1(0);

IN2(1);

}

void Motor_1_NRun(void) //反转

{

IN1(1);

IN2(0);

}

int main(void)

{

delay_init();

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //因为配置定时器用到中断,所以配置中断优先级

uart_init(115200);

/

线面的这句话就是重点重点了,之前我的电机正反转实现不了,现象不明显主要是这的问题。

首先这个9999是arr的值也就是计数从0-9999;

后面的预分频系数只要的是1,那么 TIM3的时 钟频率将为 APB1 时钟的两倍。因此,TIM3 的时钟为 72M,由公式算的现在的周期是1s。下面的比较值设置的是6000也就是说此时的占空比为40%我的延迟函数是延迟0.5s,这样相对而言是比较明的。

而我之前是这样设置的TIM3_PWM_Init(899,0); 这样用公式算出来12.5us,但是我的延迟函数还是延迟0.5s,那么这样一来,这能看见电机在不停的转,不会看见正转反转的现象。所以这个arr和psc设置也是重要啊,arr的设置以及占空比也就决定了小车的速度。

***************************************************************/

TIM3_PWM_Init(9999,7199);

while(1)

{

Motor_1_PRun();

delay_ms(500);

Motor_1_NRun();

delay_ms(500);

Motor_1_STOP();

delay_ms(500);

}

}

下面看一看PWM脉冲的仿真图像。

在这里插入图片描述

关键字:STM32  PWM  步进电机  正反转

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic472107.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:基于STM32超声波测距
下一篇:STM32实现电机的正反转

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

秉火429笔记之一初识STM32

1. STM32概述STM32,ST为意法半导体,M是Microelectronics的缩写,32表示32位,简而言之,STM32即为ST公司开发的32位微控制器。2. STM32分类STM32包含多个系列,从内核分为Cortex-M0、M3、M4、M7,每个内核有大概分为主流、高性能和低功耗。3. STM32命名规则
发表于 2019-09-12
秉火429笔记之一初识STM32

基于STM32的简单电子书的实现

;,16,RED,WHITE,0);printf("res=%x",res);return 1;         }else{       fnShowString(10,120,"open ok",16,RED,WHITE,0);}        f_lseek(&f1,32*((H8-0xa0-1)*94+(L8-0xa0-1)));                 
发表于 2019-09-12

stm32 各头文件或C文件功能

stm32f10x_con.h配置文件:加载哪个外设、使能assert 对参数进行检查,如果使能了assert 需要在main文件中添加 _assert_faild 函数。 使能assert会增大编译出执行文件的大小,调试完后可以将assert 屏蔽。stm32f10x.h头文件中包含了stm32f10x_conf.h 。stm32f10x.h1、对所有的外设的地址进行映射,映射到存储区,即定义某外设结构体变量,因为结构体是连续存储的只要将外设的基地址强制转换为结构体类型的指针,那么该外设的寄存器就可以通过指针进行访问,以GPIO为例:定义外设的结构体,结构体变量都是volatile类型,告诉编译器不要进行优化,读取值从内存读取
发表于 2019-09-12

stm32通过spi连接esp8266的hspi 开发

刚刚做了stm32通过spi连接esp8266的开发,目前已经解决了遇到的大多数问题,基本可以交付使用了,写一篇文章留作记录,也可以给以后做这个的朋友做为参考。esp8266模块本身发布的时候默认里边烧写的是AT固件,虽然硬件上有spi的引脚,但是并不支持spi的通信,如果要支持spi的通信,自行修改编译esp8266的sdk,写自己需要的代码来实现。本身sdk中有相关的例程,根据例程的代码修改调试就可以实现相应的功能。使用spi的好处,第一 可以节省一个串口,因为stm的串口资源是比较有限的。另外spi的通讯速度要比串口快一些。这篇文章将包含如下的一些内容:1,stm32 spi的驱动如何开发?2,esp8266端的驱动如何开发
发表于 2019-09-12
stm32通过spi连接esp8266的hspi 开发

stm32的SPI设置步骤,SPI配置参数

用stm32的库进行深入SPI接口主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。四根线MISO 主设备数据输入,从设备数据输出。MOSI 主设备数据输出,从设备数据输入。SCLK时钟信号,由主设备产生。CS从设备片选信号,由主设备控制。外设的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节时钟极性CPOL对传输协议没有重大的影响,代表串行同步时钟的空闲状态下的电平。时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿(上升
发表于 2019-09-12

关于STM32f103 SPI时钟速度的问题

STM32f103 中APB1的最高频率是36MHz,APB2的最高频率是72MHz,而PCLK1和PCLK2一般也默认配置为其最高工作频率36M和72M。如下图(STM32F10xx_参考手册(第7版) 第46页)时钟树所示:SPI1时钟由APB2时钟分频而来,可以选择2、4、8、16、32、64、128、256这几个分频系数。而手册规定STM32的SPI时钟最快是18MHz。对于STM32F103的SPI1接口时钟,由72M的PCLK2分频得到,所以分配系数大于等于4(72M/4 = 18M)。对于STM32F103的SPI2/SPI3接口时钟,由36M的PCLK1分频得到,所以分配系数大于等于2(36M/2 = 18M
发表于 2019-09-12
关于STM32f103 SPI时钟速度的问题

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved