基础实验
PWM电机驱动实验
飞控板上的电机是接到TIM2上的四个PWM通道上的,STM32一个定时器就可以输出4路频率和占空比都不同的PWM,因为4个电机是一起的,还是把频率都设置成一样的吧
顺便把频率都试了一下,发现在占空比相同时,在不同的频率下电机的转速都不太一样,频率越高转速越低,当然我没有拿专业的仪器测过,只是把1K,10K,100K频率都试了一下,发现1KHz时螺旋桨产生的升力明显比其他的大,网上看到网友说PWM控制电机的频率不能太低,然后在试了一下2K,5K的情况,于是决定把驱动的频率定在了2KHz。这里只是个人的看法,不对之处还要请大神指出啊。。。。。。。
下面提供KEIL的逻辑分析仪仿真教程,不想下到板子的话直接仿真就好,还可以看到波形频率
特别提醒,如果是直接下到飞控板上的话,一定要先用手抓紧板子,别被螺旋桨打到手了,板子用下载线供电就足够供电机了,不要以为把开关关了就没事了
void TIM2_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1| GPIO_Pin_2| GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
TIM_InternalClockConfig(TIM2);//设置TIMx内部时钟
TIM_TimeBaseStructure.TIM_Prescaler = 35;//预分频值
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式
TIM_TimeBaseStructure.TIM_Period = 1000;//在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_RepetitionCounter = 1;//重复计数值
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);//初始化
// T = 1/(72M/TIM_Prescaler+1)= 1/(72M/36)= 0.5uS
// 频率 = TIM_Period * T = 1000*0.5uS = 500ms -> 2kHz
// 占空比 = TIM_Pulse / TIM_Period = 200/1000 =0.2= 20%
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//PWM模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//使能
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;//失能
TIM_OCInitStructure.TIM_Pulse = 200;//脉冲宽度,由这个设置占空比
// TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//高电平有效
// TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;//高电平有效
// TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;//低电平
// TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;//低电平
TIM_OC1Init(TIM2,&TIM_OCInitStructure);//初始化
TIM_OCInitStructure.TIM_Pulse = 400;//脉冲宽度,由这个设置占空比
TIM_OC2Init(TIM2,&TIM_OCInitStructure);//初始化
TIM_OCInitStructure.TIM_Pulse = 600;//脉冲宽度,由这个设置占空比
TIM_OC3Init(TIM2,&TIM_OCInitStructure);//初始化
TIM_OCInitStructure.TIM_Pulse = 800;//脉冲宽度,由这个设置占空比
TIM_OC4Init(TIM2,&TIM_OCInitStructure);//初始化
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);//使能或失能TIM外设预装载寄存器在CCR1
TIM_ARRPreloadConfig(TIM2, ENABLE);//使能或者失能TIMx在ARR上的预装载寄存器
TIM_Cmd(TIM2, ENABLE);//使能或者失能TIMx外设
TIM_CtrlPWMOutputs(TIM2, ENABLE);//使能或失能TIM外设的主输出
}
void set_PWM(uint16_t PWM1,uint16_t PWM2,uint16_t PWM3,uint16_t PWM4)
{
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_Pulse = PWM1;//脉冲宽度,由这个设置占空比
TIM_OC1Init(TIM2,&TIM_OCInitStructure);//初始化
TIM_OCInitStructure.TIM_Pulse = PWM2;//脉冲宽度,由这个设置占空比
TIM_OC2Init(TIM2,&TIM_OCInitStructure);//初始化
TIM_OCInitStructure.TIM_Pulse = PWM3;//脉冲宽度,由这个设置占空比
TIM_OC3Init(TIM2,&TIM_OCInitStructure);//初始化
TIM_OCInitStructure.TIM_Pulse = PWM4;//脉冲宽度,由这个设置占空比
TIM_OC4Init(TIM2,&TIM_OCInitStructure);//初始化
}