历史上的今天
今天是:2024年08月22日(星期四)
2019年08月22日 | STM32用PWM实现步进电机的正反转
2019-08-22 来源:eefocus
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超声波测距
下一篇:STM32实现电机的正反转
史海拾趣
|
library ieee;--消抖动 延迟10msuse ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity dou isport(s,clk1k:in std_logic; so:Put std_logic);end;architecture one of dou issignal cout4 :std_logic_vect ...… 查看全部问答> |
|
博创pxa270开发板WINCE内核不支持VGA输出,请求帮助 WINCE系统驱动上面我一点都不懂,公司前两天买了博创的PXA270开发板,没有买LCD屏,LINUX下我用普通电脑显示屏,它是可以显示内容的.后来我刷了它的WINCE5.0内核,一直在电脑显示屏上显示不出来图像,咨询售后说是,没有买他们的LCD屏的问题? 大家手里有 ...… 查看全部问答> |
|
void SPI_Init() { //----------- IMPORTANT: By default, the internal clock is disabled. To configure the controller ------ // & ...… 查看全部问答> |
|
用的workbench3.0 选的是SIMNTdiab,编译通过,但是下载.OUT文件的时候 提示如下: “Please resolve following symbols before next download semBSmCreate smNameAdd” 不知道该如何解决,我是初学者一个。 源程序如下: #include #inc ...… 查看全部问答> |
|
各位高手,我想用51通过串口来控制SIM300收发数据,现在已经把SIM300模块和51实验板通过串口连接起来了,可写完程序后模块没有反应,不知道为什么,需要对模块初始化吗?我把程序贴上来麻烦大家看看有什么问题。另外我想用串口接收字符串并判断接 ...… 查看全部问答> |
|
【求助】宏定义时溢出,想用unsigned int,怎么办? 宏定义时溢出,想用unsigned int,怎么办? ============================================================ 有如下一句定义: #define TIMER_A_50 (750*50) // 50ms 程序中有: CCR0 = TIMER_A_50; // 50 ...… 查看全部问答> |




