一、L9110电机知识储备
1.特点
- 低静态工作电流;
- 宽电源电压范围:2.5V-12V;
- 每通道具有800mA连续电流输出能力;较低的饱和压降;
- TTL/CMOS输出电平兼容,可直接连CPU;输出内置钳位二极管,适用于感性负载;控制和驱动集成于单片IC之中;
- 具备管脚高压保护功能;
- 工作温度:0℃-80℃;
2.电机的工作方式
- IA输入高电平,IB输入低电平,【OA1 OB1】电机正转;
- IA输入低电平,IB1输入高电平,【OA1 OB1】电机反转;
(实际上,当我们接上电源后,电机即可转动)
二、使用PWM控制电机正转
1、引脚连接方式
C8T6 | L9110电机 |
---|---|
VCC | VCC |
GND | GND |
PA11 | IA |
悬空 | IB |
2、核心驱动代码
(1)、demoForFen()函数
/* 一个用于测试风扇的demo */
void demoForFeng(void)
{
u16 led0pwmval=0;
u8 dir=1;
TIM1_PWM_Init(899,0);//不分频。PWM频率=72000/(899+1)=80Khz
//频率越高越不容易闪烁(下是占空比与频率的关系)
//一般人眼睛对于80Hz 以上刷新频率则完全没有闪烁感
//正常的电机频率在 6-16kHZ之间为好
//https://blog.csdn.net/as480133937/article/details/103439546/
while(1)
{
delay_ms(10);
//转速慢慢改变 会停一会儿(停的时间比较长应该是因为在刚开始的一段时间有效占空比的时间比较短)
if(dir)led0pwmval++;
else led0pwmval--;
if(led0pwmval>900)dir=0;
if(led0pwmval==0)dir=1;
//900~0
//占空比计算:led0pwmval/arr+1;
printf("led0pwmval:%d\r\n",(int)led0pwmval);
//通道比较值 修改TIM1_CCR1 占空比
TIM_SetCompare4(TIM1,led0pwmval);
}
}
(2)、PWM初始化-TIM1_PWM_Init()函数
在PWM初始化时,需要注意的是初始化引脚要与定时器通道相匹配,否则的话,硬件设备就不会响应该引脚的输出。
void TIM1_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);// 使能定时器1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //使能GPIO外设时钟使能
/******************** 1 ************************/
//设置该引脚为复用输出功能,输出TIM1 CH4的PWM脉冲波形
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //TIM_CH4
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 80KHZ
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 不分频
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
/******************** 2 ************************/
TIM_OC4Init(TIM1, &TIM_OCInitStructure); //根据TIM_OCInitStruct中指定的参数初始化外设TIMx 通道4
TIM_CtrlPWMOutputs(TIM1,ENABLE); //MOE 主输出使能
/******************** 3 ************************/
TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable); //CH4预装载使能
TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器
TIM_Cmd(TIM1, ENABLE); //使能TIM1
}
三、使用PWM控制电机正转或者反转
1、引脚连接方式
由于电机的工作方式,可以知道要想实现电机正转或者反转,需要初始化两个引脚。因此,有以下引脚连接方式:
C8T6 | L9110电机 |
---|---|
VCC | VCC |
GND | GND |
PA11 | IA |
PA1 | IB |
2、实现代码
要实现自主控制电机正转或者反转,只需要在控制电机正转的基础之上进行改进即可。首先,添加引脚PA1的初始化:
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //TIM_CH1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
其次,定义一个变量fanDirection用以辅助我们控制电机:
//fanDirection的值为1电机反转;否则,正转
int fanDirection = 1;
最后,将判断电机正转还是反转的判断语句放在通道比较之前即可:
if (fanDirection == 0){//电机正转
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
}else{//电机反转
GPIO_SetBits(GPIOA,GPIO_Pin_1);
}
四、总结
L9110电机的使用比较简单,当IA输入高电平,IB输入低电平,电机正转;当IA输入低电平,IB1输入高电平,电机反转。