STM32在定时器中控制步进电机

写WEB程序的时候,发现如果加上步进电机控制的话,就会出现问题。原因是如果把电机控制放在uip循环中处理的话,因为控制电机涉及到时间问题。所以必须解决,想到的方法就是多任务的思想。把步进电机的处理放在定时器中断里面。这样的话就能避免问题了。顺便学习了库函数操作定时器。这里用到的定时器功能简单,只需要产生更新中断。

下面是定时器初始化代码

//定时器3初始化
//arr:定时重装值
//psc:分频值
void TIM3_Init(uint16_t arr, uint16_t psc)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);	//开启TIM3时钟

	//定时器3配置,重载值、分频值、分频系数、计数模式
	TIM_TimeBaseStructure.TIM_Period = arr;
	TIM_TimeBaseStructure.TIM_Prescaler = psc;
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
	TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); 	//允许定时更新中断

	//中断配置
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);

	TIM_Cmd(TIM3, ENABLE); 	//使能定时器3
}

定时器中断处理函数

void TIM3_IRQHandler(void)
{
  	static uint8_t i;	//相序计数器

	if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
	{
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
		Motorcw(i);		//电机正转
		i++;
		if(i==4)
		  i = 0;
	}
}

电机正传代码函数

void Motorcw(uint8_t i)
{
	GPIO_Write(GPIOC,phasecw[i]);
}

这样的话就不能干扰到uip的正常事件处理了。

时间: 2024-10-25 02:30:15

STM32在定时器中控制步进电机的相关文章

Stm32高级定时器(三)

Stm32高级定时器(三) 1 互补输出和死区插入 1.1 死区:某个处于相对无效状态的时间或空间 本来OCX信号与OCXREF时序同相同步,OCXN信号与OCXREF时序反相同步.但为了安全考虑,以OCXREF为参考基准,OCXN和OCX通道将理论上本该导通的时间点往后延时一下,即做从截止切换到导通状态的延时. 特点: ● OCx输出信号与参考信号相同,只是它的上升沿相对于参考信号的上升沿有一个延迟. ● OCxN输出信号与参考信号相反,只是它的上升沿相对于参考信号的下降沿有一个延迟. 1.2

STM32串口控制步进电机(原创)

用的42步进电机: 厂家可能不一样,两项四线步进电机,里面有两个线圈.在电机什么电都没有接的情况下,用万用表测量四个管脚:两两短接(或者阻值很小)的为一组,可以分别接A+,a-剩余接B+,B-;顺序可以互换:  经测,我用的17hs4417  黑绿一组,红蓝一组. 建议还是买个步进电机驱动器,五六十一个,相当好用. 贴一下STM32串口控制步进电机的代码: #include "led.h" #include "delay.h" #include "key.

Stm32高级定时器(一)

Stm32高级定时器(一) 1 定时器的用途 2 高级定时器框图 3 时基单元 4 通道 1 定时器的用途 已知一个波形求另一个未知波形(信号长度和占空比) 已知波形的信号长度和占空比产生一个相应的波形 增量正交编码器驱动电机获得动态信息(速度.加速度) 测量输入信号的脉冲宽度(输入捕获) 产生输出波形(输出比较.PWM.嵌入死区时间的互补PWM等) …… 我们知道,当我们需要测量一段直线的长度时,我们需要一把直尺,根据直尺上的刻度读出直线的长度,定时器也相当于直尺能够测量和产生特定的波形. 比

STM32使用定时器实现输入捕获

输入捕获简介输入捕获模式可以用来测量脉冲宽度或者测量频率.STM32的定时器,除了TIM6和TIM7,其他定时器都有输入捕获功能. STM32的输入捕获,简单地说就是通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将此刻定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获. 使用TIM2输入捕获的配置步骤:1.开启TIM2时钟,配置PA0为下拉输入.需要使用到PA0作为TIM2_CH1上面的脉冲输入.2.设

Stm32高级定时器(二)

Stm32高级定时器(二) 1 主从模式:主?从? 谈论主从,可知至少有两个以上的触发或者驱动信号,stm32内部有多个定时器,可以相互之间驱动或者控制. 主模式:定时器使能只受驱动时钟控制或者输出控制信号(TRGO). 从模式:复位模式, 在发生一个触发输入事件时,计数器和它的预分频器能够重新被初始化:同时,如果IMx_CR1寄存器的URS 位为低,还产生一个更新事件UEV :然后所有的预装载寄存器(TIMx_ARR ,TIMx_CCRx)都被更新了. 从模式:门控模式, 计数器的使能依赖于选

Stm32高级定时器(四)

Stm32高级定时器(四) 1 编码器接口模式 1.1 编码器原理 什么是正交?如果两个信号相位相差90度,则这两个信号称为正交.由于两个信号相差90度,因此可以根据两个信号哪个先哪个后来判断方向.根据每个信号脉冲数量的多少及整个编码轮的周长就可以算出当前行走的距离.如果再加上定时器的话还可以计算出速度. 增量式旋转编码器通过内部两个光敏接受管转化其角度码盘的时序和相位关系,得到其角度码盘角度位移量增加(正方向)或减少(负方向). A,B两点对应两个光敏接受管,A,B两点间距为 S2 ,码盘的光

stm32 PWM & 定时器总结

学习后发现stm32的定时器功能确实很强大,小总结一下方便以后使用的时候做参考.Stm32定时器一共分为三种:tim1和tim8是高级定时器,6和7是基本定时器,2-5是通用定时器.从名字就可以看得出来主要功能上的差异.今天我主要是用定时器做pwm输出,所以总结也主要是针对pwm方面的. 先大致说下通用和高级定时器的区别.通用的可以输出四路pwm信号互不影响.高级定时器可以输出三对互补pwm信号外加ch4通道,也就是一共七路. 所以这样算下来stm32一共可以生成4*5+7*2=30路pwm信号

STM32 通用定时器相关寄存器

TIMx_CR1(控制寄存器1) 9-8位:CKD[1:0]时钟分频因子,定义在定时器时钟(CK_INT)频率与数字滤波器(ETR,TIx)使用的采样频率之间的分频比例. 定义:00(tDTS = tCK_INT),01(tDTS = 2 x tCK_INT),10(tDTS = 4 x tCK_INT)11:保留 7位:ARPE:自动重装载预装载允许位,定义:0(TIMx_ARR寄存器没有缓冲),1(TIMx_ARR寄存器被装入缓冲器) 6-5位:CMS[1:0]选择中央对齐模式,定义:00:

STM32之定时器

一.定时器简介 1.时钟来源 2.定时器结构(以基本定时器为例) 二.基本定时器的编程方法 1.基本定时器的寄存器 2.例程 /** * @brief 定时器6的初始化,定时周期0.01s * @param 无 * @retval 无 */ void TIM6_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; /*AHB = 72MHz,RCC_CFGR的PPRE1 = 2,所以APB1 = 36MHz,TIM2CLK = A