完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
之前是用的延时驱动步进电机,但是要求我的电机转的慢,所以整个延时导致对我的程序影响大,现在想换tiM4的pwm驱动步进电机,用以前驱动直流电机的改,但是不成功,请大神帮忙看看,或者分享一个DEMO,谢谢啦!!
==================================这是以前控制双电机的驱动======================================= /************************************************************** * Function : 控制双电机的方向,占空比,速度 * Description : 电机驱动控制程序(new) * Input : motorL, motorR, left_motor1,left_motor2,right_motor1,right_motor2 (控制前进后退与方向,占空比) * Output : None * Return : None * Others : left_motor1,left_motor2,right_motor1,right_motor2 代表控制电机的对应的pwm值(0~1000,也可以调档) * Author : Draway ****************************************************************/ void CtrlMotor(Direction motorL,u16 left_motor1,u16 left_motor2,Direction motorR,u16 right_motor1,u16 right_motor2) { if(motorL==RUN_FORWARD)//左轮前进 { GPIO_SetBits(GPIOB,GPIO_Pin_6); GPIO_ResetBits(GPIOB,GPIO_Pin_7); } else if(motorL==RUN_BACKWARD)//左轮后退 { GPIO_SetBits(GPIOB,GPIO_Pin_7); GPIO_ResetBits(GPIOB,GPIO_Pin_6); } else if(motorL==STOP)//左轮停转 { GPIO_SetBits(GPIOB,GPIO_Pin_7); GPIO_SetBits(GPIOB,GPIO_Pin_6); } if(motorR==RUN_FORWARD)//右轮前进 { GPIO_SetBits(GPIOB,GPIO_Pin_8); GPIO_ResetBits(GPIOB,GPIO_Pin_9); } else if(motorR==RUN_BACKWARD)//右轮后退 { GPIO_SetBits(GPIOB,GPIO_Pin_9); GPIO_ResetBits(GPIOB,GPIO_Pin_8); } else if(motorR==STOP) //右轮后退 { GPIO_SetBits(GPIOB,GPIO_Pin_9); GPIO_SetBits(GPIOB,GPIO_Pin_8); } TIM_SetCompare1(TIM4,left_motor1); TIM_SetCompare2(TIM4,left_motor2); TIM_SetCompare3(TIM4,right_motor1); TIM_SetCompare4(TIM4,right_motor2); } ================================这是我改的驱动步进电机驱动================================================ /************************************************************** * Function : 控制步进电机的方向,占空比,速度 * Description : 电机驱动控制程序(new) * Input : motorL, motorR, left_motor1,left_motor2,right_motor1,right_motor2 (控制前进后退与方向,占空比) * Output : None * Return : None * Others : left_motor1,left_motor2,right_motor1,right_motor2 代表控制电机的对应的pwm值(0~1000,也可以调档) * Author : Draway * Date : 2016年1月21日 ****************************************************************/ void CtrlMotor_BJ(Direction motor) { if(motor==RUN_FORWARD)//前进 { Coil_A1 TIM_SetCompare1(TIM4,FAST_F); TIM_SetCompare2(TIM4,END_F); TIM_SetCompare3(TIM4,END_F); TIM_SetCompare4(TIM4,END_F); Coil_AB1 TIM_SetCompare1(TIM4,FAST_F); TIM_SetCompare2(TIM4,FAST_F); TIM_SetCompare3(TIM4,END_F); TIM_SetCompare4(TIM4,END_F); Coil_B1 TIM_SetCompare1(TIM4,END_F); TIM_SetCompare2(TIM4,FAST_F); TIM_SetCompare3(TIM4,END_F); TIM_SetCompare4(TIM4,END_F); Coil_BC1 TIM_SetCompare1(TIM4,END_F); TIM_SetCompare2(TIM4,FAST_F); TIM_SetCompare3(TIM4,FAST_F); TIM_SetCompare4(TIM4,END_F); Coil_C1 TIM_SetCompare1(TIM4,END_F); TIM_SetCompare2(TIM4,END_F); TIM_SetCompare3(TIM4,FAST_F); TIM_SetCompare4(TIM4,END_F); Coil_CD1 TIM_SetCompare1(TIM4,END_F); TIM_SetCompare2(TIM4,END_F); TIM_SetCompare3(TIM4,FAST_F); TIM_SetCompare4(TIM4,FAST_F); Coil_D1 TIM_SetCompare1(TIM4,END_F); TIM_SetCompare2(TIM4,END_F); TIM_SetCompare3(TIM4,END_F); TIM_SetCompare4(TIM4,FAST_F); Coil_DA1 TIM_SetCompare1(TIM4,FAST_F); TIM_SetCompare2(TIM4,END_F); TIM_SetCompare3(TIM4,END_F); TIM_SetCompare4(TIM4,FAST_F); // GPIO_SetBits(GPIOB,GPIO_Pin_6); // GPIO_ResetBits(GPIOB,GPIO_Pin_7); } else if(motor==RUN_BACKWARD)//后退 { Coil_A1 Coil_DA1 //遇到Coil_AB1 用{A1=1;B1=1;C1=0;D1=0;}代替 Coil_D1 Coil_CD1 Coil_C1 Coil_BC1 Coil_B1 Coil_AB1 // GPIO_SetBits(GPIOB,GPIO_Pin_7); // GPIO_ResetBits(GPIOB,GPIO_Pin_6); } else if(motor==STOP)//电机停转 { GPIO_SetBits(GPIOB,GPIO_Pin_9); GPIO_SetBits(GPIOB,GPIO_Pin_8); GPIO_SetBits(GPIOB,GPIO_Pin_7); GPIO_SetBits(GPIOB,GPIO_Pin_6); TIM_SetCompare1(TIM4,END_F); TIM_SetCompare2(TIM4,END_F); TIM_SetCompare3(TIM4,END_F); TIM_SetCompare4(TIM4,END_F); } // //尽量统一用库函数操作 // TIM_SetCompare1(TIM4,left_motor1); // TIM_SetCompare2(TIM4,left_motor2); // TIM_SetCompare3(TIM4,right_motor1); // TIM_SetCompare4(TIM4,right_motor2); } ///=====================/步进电机宏定义=============================== //#define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电 //#define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电 //#define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电 //#define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电 //#define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电 //#define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电 //#define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电 //#define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通电,其他相断电 //#define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电 ====================延时可以正常步进驱动电机程序============================= //正转 void motor_go(u16 data) { Coil_A1 delay_motor(data); //延时参数 Coil_AB1 //遇到Coil_AB1 用{A1=1;B1=1;C1=0;D1=0;}代替 delay_motor(data); //延时参数 //改变这个参数可以调整电机转速 , Coil_B1 delay_motor(data); //延时参数 Coil_BC1 delay_motor(data); Coil_C1 delay_motor(data); Coil_CD1 delay_motor(data); Coil_D1 delay_motor(data); Coil_DA1 delay_motor(data); }
|
|
相关推荐
12个回答
|
|
你先测一下你那个口上的PWM波形对不对。
|
|
|
|
已经确定这样是不行了,我用延时写的时候,测得是每个I/O都有方波的,这个只两个I/O口有方波。 |
|
|
|
那还是你PWM的配置不对吧,你再看一看这一部分的程序 |
|
|
|
首先你没有步进电机驱动器,有那pwm控制比较简单,现在按你这种方式一个定时器产生四路pwm估计行不通,推荐你用一个定时器定时产生中断,在中断中按方式控制相序切换,定时器时长可以控速,这样方便你编程,要启动电机就开定时开中断设定速度,就是这样!
|
|
|
|
|
|
|
|
475569117 发表于 2016-1-22 10:20 嗯,昨天晚上回去,正是想改为这样方法,直接定时器中断控制,这样也不会影响程序运行速度了 |
|
|
|
475569117 发表于 2016-1-22 10:20 /通用定时器4中断初始化 void Timer4_Init(u16 arr,u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //时钟使能 TIM_TimeBaseStructure.TIM_Period = 10; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到10000为1000ms (1s) TIM_TimeBaseStructure.TIM_Prescaler =(7200-1); //设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 TIM_ITConfig( //使能或者失能指定的TIM中断 TIM4, //TIM4 TIM_IT_Update | //TIM 中断源 TIM_IT_Trigger, //TIM 触发中断源 ENABLE //使能 ); NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; //TIM3中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能 NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 TIM_Cmd(TIM4, ENABLE); //使能TIMx外设 } //定时TIM4中断 用于驱动步进电机 void TIM4_IRQHandler(void) //TIM4中断 { u16 SYS_TIME4=0; //定时器驱动最小位 if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 这里用time4_flag代替了之前的条件(之前条件用宏定义) { TIM_ClearITPendingBit(TIM4, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源 SYS_TIME4++; if(0<=SYS_TIME4 else if(N<=SYS_TIME4<2*N) {Coil_AB1 SYS_TIME4++;printf("yes_time4-3n");} //遇到Coil_AB1 用{A1=1;B1=1;C1=0;D1=0;}代替 else if(2*N<=SYS_TIME4<3*N) { Coil_B1 printf("yes_time4-3n");} else if(3*N<=SYS_TIME4<4*N) { Coil_BC1} else if(4*N<=SYS_TIME4<5*N) { Coil_C1 } else if(5*N<=SYS_TIME4<6*N) { Coil_CD1} else if(6*N<=SYS_TIME4<7*N) { Coil_D1} else if(7*N<=SYS_TIME4<8*N) { Coil_DA1} else if(SYS_TIME4>=8*N) // { SYS_TIME4=0; printf("yes_time4n"); //TIM_Cmd(TIM4,DISABLE); //使能TIMx外设 关定时器 } } } |
|
|
|
您好,这个样写应该没有问题吧? |
|
|
|
|
|
|
|
|
|
|
|
中断退出时要清中断标记,不然下次进不来中断,中断里面程序尽量精简写 |
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
775 浏览 0 评论
1943 浏览 1 评论
【⌈嵌入式机电一体化系统设计与实现⌋阅读体验】+磁力输送机系统设计的创新与挑战
1671 浏览 0 评论
3761 浏览 2 评论
5309 浏览 6 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-28 19:12 , Processed in 0.999654 second(s), Total 97, Slave 78 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号