参考的,淘宝上买来的步进电机S曲线驱动方法,发现
他程序输出的PWM波形全是方波, 占空比为50%
而且他
修改这两个数来输出波形,所以
我打算参考这个来写一个驱动
TIMX_CNT中放置的是当前计数值
即为:
修改计数器的计数值 ARR 和CNT
如下是修改后的 产生一个 50us高电平 100us低电平的程序
the flowing code is the timer3's init pro
1 //通用定时器3中断初始化 2 //这里时钟选择为APB1的2倍,而APB1为36M 3 // Tout =( (arr+1)*(psc+1) )/Ft us 4 //arr:自动重装值。 5 //psc:时钟预分频数 6 //这里使用的是定时器3! 7 void TIM3_Int_Init(u16 arr,u16 psc) 8 { 9 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure ; 10 NVIC_InitTypeDef NVIC_InitStructure; 11 12 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能 13 14 //定时器TIM3初始化 15 TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 16 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 17 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim 18 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 19 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位 20 21 TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断 22 23 //中断优先级NVIC设置 24 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断 25 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级 26 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级 27 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能 28 NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器 29 30 31 TIM_Cmd(TIM3, ENABLE); //使能TIMx 32 }
the fllowing code is the TIM3_IRQHandler
1 //中断服务程序 2 void TIM3_IRQHandler(void) //TIM3中断 3 { 4 if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否 5 { 6 TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志 7 //LED1=!LED1; 8 //LED0=!LED0; 9 //CLK=!CLK; 10 //GPIO_SetBits(GPIOB,GPIO_Pin_5); 11 12 // if(MyPwmChangeFlag==0)// if is 0 do low process 13 // { 14 // GPIO_ResetBits(GPIOB,GPIO_Pin_5); 15 // TIM3_Int_Init(MyPwmPeriod-MyPwmHigh-1,72-1); 16 // TIM_Cmd(TIM3, ENABLE); //使能TIMx 17 // MyPwmChangeFlag=1; 18 // } 19 // else if(MyPwmChangeFlag==1) 20 // { 21 // GPIO_SetBits(GPIOB,GPIO_Pin_5); 22 // TIM3_Int_Init(MyPwmHigh-1,72-1); 23 // TIM_Cmd(TIM3, ENABLE); //使能TIMx 24 // MyPwmChangeFlag=0; 25 // } 26 CLK=~CLK; 27 if(MyPwmChangeFlag) 28 { 29 TIM3->ARR=99; 30 TIM3->CNT=0; 31 MyPwmChangeFlag=0; 32 } 33 else 34 { 35 TIM3->ARR=49; 36 TIM3->CNT=0; 37 MyPwmChangeFlag=1; 38 } 39 40 41 } 42 }