目录
1.前言
2.操作全程
2.1输出pwm信号
2.2硬件部分
2.3电调校准
3.启动
4.总结
1.前言
我们小伙伴是不是都遇到到过我们的无刷电机买回来,上电,并且给了正确的pwm超,但是电机就是不转动。我也遇到了这个问题,不过最后还是让我蒙对了,哈哈。下面开始我们的操作。本人学识尚浅,如果有什么不对的地方,还望各位大佬们指导。(还有就是我对文章使用功能还不是很了解,往各位小伙伴多多包涵)
2.操作全程
2.1输出pwm
我们需要关注两个关键词:
1.pwm的频率、周期。
2.输出最大、最小pwm信号脉冲宽度。
一般电调频率50hz左右(20ms),最大脉冲宽度4%-11%(0.8ms-2.2ms)。(这个是我设置的参数)
(因为我们是模拟遥控器来控制无刷电机,所以最大最小脉冲宽度的设置是为了电调确定pwm的量程)
那么现在我们进行第一步生成一个50hz(20ms)的pwm先,下面生成代码部分(大家可以自己写):
void PWM_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_InternalClockConfig(TIM2);
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = 1000 - 1; //ARR
TIM_TimeBaseInitStructure.TIM_Prescaler = 1440 - 1; //PSC
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0; //CCR 0-ARR
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0; //CCR
TIM_OC2Init(TIM2, &TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0; //CCR
TIM_OC3Init(TIM2, &TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0; //CCR
TIM_OC4Init(TIM2, &TIM_OCInitStructure);
TIM_Cmd(TIM2, ENABLE);
}
void PWM_SetCompare1(uint16_t Compare)
{
TIM_SetCompare1(TIM2, Compare);
}
到第二步,把最大、最小脉冲宽度先确定好,并用三个按键(两个按键也行)控制mcu输出最大脉冲宽度、最小脉冲宽度和增加脉冲宽度的pwm信号,下面生成代码部分(大家可以自己写):
//按键部分
void Key_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 |GPIO_Pin_9 | GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
//主函数部分
void main(void)
{
while(1)
{
if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_8) == 0)
{
PWM_SetCompare1(110);//输出最大脉冲宽度
}
if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9) == 0)
{
PWM_SetCompare1(40);//输出最小脉冲宽度
}
if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_10) == 0)
{
PWM_SetCompare1(40+i);
i=i+10;
}
}
}
如果条件允许还可以拿示波器先看看自己输出的波形对不对先,再进行下面的步骤,下面是我上电前测试的图片:
最小脉冲宽度:
最大脉冲宽度:
2.2硬件部分
第三步接线:
注意:一定要电调跟单片机共地(你可以拿电调给单片机供电).
现在开始连线,注意不要接反就行。
一般电调
输入有两根电源线(大大的那两根),接电调允许内的电压。(可以问商家,几s的)
还有三根小小的线,黄色一般为pwm信号线,中间那根红色线为输出5v电源线(注意是输出5v),最后那根是地线一般是棕色或者黑色(注意是输出)。
还有另外三根接无刷电机,任意接,如果发现无刷电机转动方向反了可以把任意两条调换位置。
2.3电调校准
第四步:
注意:不要带桨叶测试,非常危险。
1.先让单片机输出最大脉冲宽度的pwm。
2.然后给电调上电,注意听声音,如果电调发出嘀嘀两声(那么油门最高点确认成功)。
3.再用按键输出最小脉冲宽度的pwm。
4.然后听声音,听到嘀嘀嘀三声(那么油门最低点确认成功,2S二声,3S三声)。
5.最后就是按按键让pwm脉冲宽度逐渐增大,无刷电机转速对应的增大了。
(然后以后上电只需要从最小油门开始启动电机就行了)
4.总结
1.保证输出pwm信号的mcu与电调的地线要共地,因为需要mcu和电调要有基准电压。
2.电调如果一直有规律的滴滴滴,那么说明pwm输入的频率不对,或者没有给pwm。(当然也有可能给的pwm是正确的,但是单片机跟电调没有共地)
还有就是不要带桨叶测试,非常危险。
标签:Pin,无刷电机,TIM,OCInitStructure,GPIO,pwm,电调 From: https://blog.csdn.net/2301_77616962/article/details/142766527