snifer

[原创]实践之基于ADI Blackfin ADSP 的直流电机驱动

0
阅读(2872)

上午一直跟同学们讨论关于直流电机驱动的问题,下午终于实现了,写出来给大家分享一下。

主要用直流电机实现车库的控制,以下为实现原理:

1、直流电动机的PWM电路原理
晶体管的导通时间也被称为导通角а,若改变调制晶体管的开与关的时间,也就是说通过改变导通角а的大小,如下图所示,来改变加在负载上的平均电压的大小,以实现对电动机的变速控制,称为脉宽调制(PWM)变速控制。在PWM变速控制中,系统采用直流源,放大器的频率是固定,变速控制通过调节脉宽来实现。构成PWM的功率转换电路或者采用"H"桥式驱动,或者采用"T"式驱动。由于"T"式电路要求双电源供电,而且功率晶体管承受的反向电压为电源电压的两倍。因此只适用于小功率低电压的电动机系统。而"H"桥式驱动电路只需一个电源,功率晶体管的耐压相对要求也低些,所以应用得较广泛,尤其用在耐高压的电动机系统中。

 

                                                                     脉宽调制(PWM)变速原理图

2、直流电动机的PWM等效电路
如下图所示:是一个直流电动机的PWM控制电路的等效电路。在这个等效电路中,传送到负载(电动机)上的功率值决定于开关频率、导通角度及负载电感的大小。开关频率的大小主要和所用功率器件的种类有关,对于双极结型晶体管(GTR),一般为lkHz
至5kHz,小功率时(100W,5A以下)可以取高些,这决定于晶体管的特性。对于绝缘栅双极晶体管(IGBT),一般为5kHz至l2kHz;对于场效应晶体管(MOSFET),频率可高达2OkHz。另外,开关频率还和电动机电感有关,电感小的应该取得高些。

  

驱动的实现:

ucLinux 下的直流电机程序包括模块驱动程序和应用程序两部分。Module 驱动程序实现了以
下方法:
static struct file_operations Blackfin_dcm_fops = {
owner: THIS_MODULE,
open:Blackfin_dcm_open,
ioctl:Blackfin_dcm_ioctl,
release: Blackfin_dcm_release,
};
开启设备时,配置 IO 口为定时器工作方式:
({ GPBCON &=~ 0xf; GPBCON |= 0xa; })
配置定时器的各控制寄存器:
({ TCFG0 &= ~(0x00ff0000); \
TCFG0 |= (DCM_TCFG0); \
TCFG1 &= ~(0xf); \
TCNTB0 = DCM_TCNTB0; /* less than 10ms */ \
TCMPB0 = DCM_TCNTB0/2; \
TCON &=~(0xf); \
TCON |= (0x2); \
TCON &=~(0xf);

 TCON |= (0x19); })
在Blackfin_dcm_ioctl中提供调速功能接口:
case DCM_IOCTRL_SETPWM:
return dcm_setpwm((int)arg);
应用程序dcm_main.c中调用:
ioctl(dcm_fd, DCM_IOCTRL_SETPWM, (setpwm * factor));
从而实现直流电机速度的调整。

程序已经上交了,每一份成绩的取得都意味着无穷多的汗水和心血。