我是靠谱客的博主 无情蜜粉,这篇文章主要介绍【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
唯一不同的是加入了中断计数

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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度

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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.主函数

复制代码
1
2
3
4
5
6
int main(void) { pwm_init(); moto_shun(); }

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

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

最后

以上就是无情蜜粉最近收集整理的关于【stm32开发日志】用stm32精确控制步进电机角度的全部内容,更多相关【stm32开发日志】用stm32精确控制步进电机角度内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(75)

评论列表共有 0 条评论

立即
投稿
返回
顶部