资深版主
 
- 积分
- 1709
- 金钱
- 1709
- 注册时间
- 2012-5-10
- 在线时间
- 441 小时
|
发表于 2018-9-12 11:59:04
|
显示全部楼层
不建议用pwm,电机走步数精确控制比较麻烦,并且控制电机启停的话,一个pwm只能对应一个电机。
我一直用的方法,一个定时器控制任意数目电机
[mw_shl_code=c,true]TIM_TimeBaseInitStructure.TIM_Period = 50; //reload value 100
TIM_TimeBaseInitStructure.TIM_Prescaler= (84 - 1); //84prescaler, 84MHZ/84 = 1us
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
TIM_ARRPreloadConfig(TIM3, ENABLE);
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM3, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 9;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)
{
motor = getMotor(Motor_1);
if(motor->moveStepNum > 0)
{
motor->periodCnt++;
if(motor->periodCnt <= motor->highPwmCnt)
setMotor1ClkGPIO(ON);
else if(motor->periodCnt < motor->totalPwmCnt)
setMotor1ClkGPIO(OFF);
else if(motor->periodCnt >= motor->totalPwmCnt)[/mw_shl_code] |
|