完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
这个暑假没有回家,在学校准备九月份的电子设计竞赛。今天想给大家分享一下STM32定时器控制两个步进电机按照一定速度比转动的问题。
这次做的05年的电子设计竞赛题目,运动悬挂系统。。本实验是控制两个步进电机通过一个定滑轮用线挂一个重物,并使这个重物走直线。。 首先对定时器进行配置。 void TIM_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_DeInit(TIM3); TIM_TimeBaseStructure.TIM_Period = 8; //中断时间为 T = ( TIM_Period + 1 )*( TIM_Prescaler + 1 )/TIMxCLK(72MHZ) = 10(-6) s TIM_TimeBaseStructure.TIM_Prescaler = 7; TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); TIM_ClearFlag( TIM3, TIM_FLAG_Update); TIM_ITConfig( TIM3, TIM_IT_Update, ENABLE); } 然后写画直线的函数,思路如下,将起点和终点的坐标作为函数的传递参数。通过计算起点和终点到两个滑轮之间的距离差可以算出两个电机在这段时间转过的距离。。因为时间是相同的,所以令两个电机的速度比等于通过计算得到的距离比即可。。具体代码如下: void Draw_Line(float x1, float y1, float x2, float y2) { float L1, L2; //起始点到滑轮距离之差 float sulv; //两个电机转速比 L1 = sqrt((x1 + 15)*(x1 + 15) + (115 - y1)*(115 - y1)) - sqrt((x2 + 15)*(x2 + 15) + (115 - y2)*(115 - y2)); L2 = sqrt((95 - x1)*(95 - x1) + (115 - y1)*(115 - y1)) - sqrt((95 - x2)*(95 - x2) + (115 - y2)*(115 - y2)); if(L1>0) //控制电机正反转 GPIO_SetBits(GPIOA,GPIO_Pin_6); else GPIO_ResetBits(GPIOA,GPIO_Pin_6); if(L2>0) GPIO_SetBits(GPIOA,GPIO_Pin_7); else GPIO_ResetBits(GPIOA,GPIO_Pin_7); L1 = fabs(L1); L2 = fabs(L2); countL = L1/0.0006; //计算出走完L1、L2所需脉冲数,,0.0006是通过几组数据计算出来的。。 countR = L2/0.0006; sulv = countL*170.0 /countR; suduL = sulv; suduR = 170; //算出两个电机发生电平翻转产生脉冲的时间比 count = 0; countLR =0; TIM_Cmd(TIM3, ENABLE); //定时器开始计时 } 中断服务程序中的内容是定时器到达两个电机规定的发生电平翻转的时间的倍数是翻转电平,产生脉冲驱动电机运动。 void TIM3_IRQHandler(void) { if((countLR == (countL*2))) TIM_Cmd(TIM3, DISABLE); //两个电机运动完成,,关定时器 count++; //开始计时 if( !(count % suduR) ) { if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_4)==0) GPIO_SetBits(GPIOA,GPIO_Pin_4); else GPIO_ResetBits(GPIOA,GPIO_Pin_4); countLR++; //记录电平翻转次数,即脉冲数的一半 } if( !(count % suduL) ) { if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5)==0) GPIO_SetBits(GPIOA,GPIO_Pin_5); else GPIO_ResetBits(GPIOA,GPIO_Pin_5); } /*防止定时器溢出*/ if(count == suduL*suduR) { count=0; } TIM_ClearFlag(TIM3, TIM_FLAG_Update); //一定不要忘记清除中断位 } 以上就是我想分享给大家的,,希望对正在积极备战2013年电子设计竞赛的同学有所帮助,谢谢 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1561 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1501 浏览 1 评论
933 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
665 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1555 浏览 2 评论
1848浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
610浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
504浏览 3评论
508浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
489浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-10 16:45 , Processed in 0.717200 second(s), Total 78, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号