【stm32开发日志】用stm32精确控制步进电机角度

  1. 前言:精确控制步进电机的原理见我之前写的一篇博文:https://blog.csdn.net/weixin_39589455/article/details/89409634

程序:
1.此处是pwm输出,及普通的设置,用到TIM1的CH1通道,这里不加太多注释,可参考我的另一篇博文:https://blog.csdn.net/weixin_39589455/article/details/87902849
唯一不同的是加入了中断计数

void TIM1_PWM_Init(u16 arr,u16 psc)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
        NVIC_InitTypeDef   NVIC_InitStructure;
 
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_TIM1,ENABLE);
        //RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);;
        GPIO_DeInit(GPIOA); 
 
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
        GPIO_Init(GPIOA,&GPIO_InitStructure);     
 
        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(TIM1,&TIM_TimeBaseStructure);
        TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE );
 
        TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;
        //TIM_OCInitStructure.TIM_Channel=TIM_Channel_1;
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_Pulse=0;
        TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
        TIM_OC1Init(TIM1, &TIM_OCInitStructure);
        TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
        TIM_CtrlPWMOutputs(TIM1,ENABLE);
        TIM_ARRPreloadConfig(TIM1, ENABLE);
        TIM_CtrlPWMOutputs(TIM1,ENABLE);
    
        NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; 
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; 
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
        NVIC_Init(&NVIC_InitStructure);
 
        TIM_Cmd(TIM1,ENABLE);
}

中断服务程序:此处的100为脉冲数,使电机转45°。由于:360/800=0.45即每个脉冲使电机转0.45°,故电机转动100*0.45=45度

void TIM1_UP_IRQHandler(void)
{
	if(TIM_GetITStatus (TIM1 ,TIM_IT_Update )!=RESET )
		{
			TIM_ClearITPendingBit(TIM1 ,TIM_IT_Update );
			Pulse_Cnt++;
			if(Pulse_Cnt>100)
			{
				  Pulse_Cnt = 0;
			    TIM_Cmd(TIM1,DISABLE);
			}
		}
}

3.主函数

int main(void)
{
  pwm_init();
	moto_shun();
}

注:这里使用中断来实现控制,比较占用片内资源,如果有其他方法欢迎和我讨论呀

源代码:https://download.csdn.net/download/weixin_39589455/11129458

STM32上实现步进电机角度控制的代码可以通过以下步骤完成: 1. 配置GPIO:首先,需要配置用于控制步进电机的GPIO引脚。根据具体的硬件连接,将引脚设置为输出模式。 2. 定义步进电机驱动方式:步进电机有多种驱动方式,如全步进、半步进等。根据需要选择合适的驱动方式,并定义对应的驱动序列。 3. 编写控制代码:编写控制代码来实现步进电机角度控制。以下是一个简单的示例代码: ```c #include "stm32f4xx.h" // 定义步进电机驱动序列 uint8_t stepSequence[] = {0x01, 0x02, 0x04, 0x08}; // 定义步进电机当前位置 uint8_t currentPosition = 0; // 控制步进电机旋转到指定角度 void rotateToAngle(uint16_t angle) { // 计算需要旋转的步数 uint16_t steps = angle * 200 / 360; // 假设步进角为1.8度,一圈有200步 // 控制步进电机旋转 for (uint16_t i = 0; i < steps; i++) { // 设置GPIO引脚输出对应的驱动序列 GPIO_Write(GPIOA, stepSequence[currentPosition]); // 更新当前位置 currentPosition = (currentPosition + 1) % 4; // 添加适当的延时,控制步进电机转速 for (uint32_t j = 0; j < 10000; j++); } } int main(void) { // 初始化GPIO引脚 GPIO_InitTypeDef GPIO_InitStruct; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStruct); // 控制步进电机旋转到90度 rotateToAngle(90); while (1) { // 其他代码... } } ``` 这是一个简单的示例代码,通过控制GPIO引脚输出不同的驱动序列来驱动步进电机旋转。具体的代码实现可能会根据硬件连接和步进电机驱动方式的不同而有所变化。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别出BUG求求了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值