DRV8870集成电机驱动芯片
DRV8870芯片封装 |
引脚介绍 |
1脚 GND 用来接地。 2-3脚IN1 IN2 控制引脚,通过对这两个脚输入0与1来控制H桥上mos管的截止与导通实现对电机的驱动。 4脚 VREF 用来给该芯片供电通常电压应该大于3.3V,当然与单片机一个供电采用5V也是完全可以的。 5脚 VM 接驱动电流,其中6.5V-45V。注意一定要大于6.5V不如在输出端测量不到电压。 6、8脚 OUT2 OUT1用来接直流电机两端作为输出口。 7脚 ISEN 在电流管理模式时才使用,在本实验中用不上,直接接地即可。 |
以下为该芯片状态表与原理图
由上表可见,当IN1=1,IN2=0时,H桥的右上与左下两个mos管处于导通状态,在这个状态下OUT2相当于与VM相连,OUT1相当于与GND相连,这时负载上的电路就是由OUT2流向OUT1;当IN1=0,IN2=1时,H桥的导通情况与上述情况相反。
对于IN1与IN2全为1的情况,会使得H桥下端的两个mos管导通,这时OUT1与OUT2两个端口都与地相连所以都输出低电平。
IN1与IN2全都为0的情况下,会使得H桥中电流逆二极管导通方向流动由此输出高阻态并进入一个低功耗状态。
STC12C5A60S2中的PCA与PWM模块
在这个单片机中,PCA模块可以实现捕捉模式、16位软件定时模式、高速脉冲输出模式和PWM脉宽调制模式。
关于前三种的介绍如下
捕捉模式 |
16位软件定时模式 |
高速脉冲输出模式 |
有关PCA模块实现PWM
数据手册上内容 |
在本实验中调用PWM功能只需要使用个别几个寄存器即可,分别是CCAPMx用来选择频率与设置工作模式,CCAPxL与CCAPxH用来存储阈值,在这里两种寄存器中的数值相等,因为一个周期结束后CCAPxH中的值会自动填充到CCAPxL中。
下图为CCAPMx控制工作模式的表格,在本实验中设置其为0x42。
下图描述了PCA产生一个脉冲周期的流程图
其中EPCnL中相当于设置阈值的第九位,当其值为1时。PCA计数器中的数值永远不会大于阈值,所以这时就保证了端口会一直输出低电平。
电路设计
设计参考 | 设计原理图 |
电路板正面 | 电路板反面 |
为了实现电机在一个周期内,实现由慢到快再到慢的正转接着由慢到快再到慢的反转,需要单片机P13与P14两个输出的脉冲波呈现下图的变化趋势。
对应PCA中寄存器装载的数值
代码
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sfr CCON=0xd8;
sfr CMOD=0xd9;
sfr CCAPM0=0XDA;
sfr CCAPM1=0xdb;
sfr CL=0xe9;
sfr CH=0xf9;
sfr CCAP0L=0xea;
sfr CCAP0H=0xfa;
sfr CCAP1L=0xeb;
sfr CCAP1H=0xfb;
sfr PCAPWM0=0xf2;
sfr PCAPWM1=0xf3;
sbit CR=CCON^6;
bit flag;
bit flag1;
uchar count,count1;
void PWM();
void main()
{
TR0=0;
TMOD=0x01; //设置定时器为方式1 16位 并且工作于计时状态
TH0=0x3c; //目标间隔1秒,晶振位4M,一个机器周期3us
//让定时器计时0.15s再由i计数33次
//(2^16-50000)为TH0与TL0中值
TL0=0xb0;
EA=1; //开总中断
ET0=1; //开定时器T0中断
TR0=1;
count=7;
count1=0;
flag=1;
flag1=1;
while(1)
{
while(flag)
{
count1=count1+1;
if(count1==10)
{
count1=0;
flag1=~flag1;
}
PWM();
flag=0;
}
}
}
void timer0() interrupt 1 //中断函数因为使用定时器T0
//所以中断号为1
{
TH0=0x3c;
TL0=0xb0;
count--;
TR0=1;
if(count<=0)
{
flag=1;
count=7;
}
}
void PWM() //根据定时器的计时结果调整PWM
{
PCAPWM1=0x00;
PCAPWM0=0x00;
CCON=0;
CL=0;
CH=0;
CMOD=0x02;
if(flag1==1)
{
if(count1<=5)
{
CCAP0H=CCAP0L=count1*51;
CCAPM0=0x42;
}
if(count1>5)
{
CCAP0H=CCAP0L=510-51*count1;
CCAPM0=0x42;
}
CCAP1H=CCAP1L=0x00;
CCAPM1=0x42;
CR=1;
}
if(flag1==0)
{
if(count1<=5)
{
CCAP1H=CCAP1L=count1*51;
CCAPM1=0x42;
}
if(count1>5)
{
CCAP1H=CCAP1L=510-51*count1;
CCAPM1=0x42;
}
CCAP0H=CCAP0L=0x00;
CCAPM0=0x42;
CR=1;
}
}
实验效果
PWM 电机快转慢转