模拟信号波形控制直流电机转速Word格式文档下载.docx
《模拟信号波形控制直流电机转速Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《模拟信号波形控制直流电机转速Word格式文档下载.docx(19页珍藏版)》请在冰豆网上搜索。
图3.2综合数字信号源
3.4直流电机实验原理
3.4.1直流电机控制
直流电动机是最早出现的电动机,也是最早能实现调速的电动机。
近年来,直流电动机的结构和控制方式都发生了很大的变化。
随着计算机进入控制领域,以及新型的电力电子功率元器件的不断出现,使采用全控型的开关功率元件进行脉宽调制(PulsWidthModulation,简称PWM)控制方式已成为绝对主流。
3.4.2PWM调压调速原理
直流电动机转速n的表达式为:
其中,U为电枢端电压;
I为电枢电流;
R为电枢电路总电阻;
Φ为每极磁通量;
K为电动机结构参数。
所以直流电动机的转速控制方法可分为两类:
对励磁磁通进行控制的励磁控制法和对电枢电压进行控制的电枢控制法。
其中励磁控制法在低速时受磁极饱和的限制,在高速时受换向火花和换向器结构强度的限制,并且励磁线圈电感较大,动态响应较差,所以这种控制方法用得很少。
现在,大多数应用场合都使用电枢控制法。
绝大多数直流电机采用开关驱动方式。
开关驱动方式是使半导体功率器件工作在开关状态,通过脉宽调制PWM来控制电动机电枢电压,实现调速。
3.4.3PWM调速方法:
在PWM调速时,占空比α是一个重要参数。
以下3种方法都可以改变占空比的值:
(1)定宽调频法:
这种方法是保持t1不变,只改变t2,这样使周期T(或频率)也随之改变。
(2)调宽调频法:
这种方法是保持t2不变,只改变t1,这样使周期T(或频率)也随之改变。
(3)定频调宽法:
这种方法是使周期T(或频率)保持不变,而改变t1和t2。
前两种方法由于在调速时改变了控制脉冲的周期(或频率),当控制脉冲的频率与系统的固有频率接近时,将会引起震荡,因此这两种方法用得很少。
目前,在直流电动机的控制中,主要使用定频调宽法。
本课程设计当中也相当于采用定频调宽法。
程序中采用定时器中断产生固定频率的PWM波,在每个中断中根据当前占空比判断应输出波形的高低电平。
ADC后的值赋给设置直流电机PWM的占空比的变量uN
while
(1)
{
LoopCount++;
uN=Voltage1[ConversionCount];
}
StopCpuTimer0();
CTRGR=0;
}
3.5定时器的原理
3.5.1通用定时器介绍及其控制方法
TMS320F2812内部有3个32位的通用定时器(Timer0/1/2),这3个定时器具有完全相同的控制结构,其中Timer1和Timer2被保留给DSPBIOS或实时操作系统(RTOS),只有定时器0可以提供给用户使用,其结构如下图所示。
图3.3定时器结构图
3.5.2中断响应过程
a.接受中断请求。
必须由软件中断(从程序代码)或硬件中断(从一个引脚或一个基于芯片的设备)提出请求去暂停当前主程序的执行。
b.响应中断。
必须能够响应中断请求。
如果中断是可屏蔽的,则必须满足一定的条件,按照一定的顺序去执行。
而对于非可屏蔽中断和软件中断,会立即作出响应。
c.准备执行中断服务程序并保存寄存器的值。
d.执行中断服务子程序。
调用相应得中断服务程序ISR,进入预先规定的向量地址,并且执行已写好的ISR
3.5.3中断类别
可屏蔽中断:
这些中断可以用软件加以屏蔽或解除屏蔽。
不可屏蔽中断:
这些中断不能够被屏蔽,将立即响应该类中断并转入相应的子程序去执行。
所有软件调用的中断都属于该类中断。
若处理器采用30MHz的外部时钟,经过锁相环10/2倍频后,系统的工作时钟在150MHz。
一旦定时器被使能,定时器时钟通过预定标计数器(PSCH:
PSC)递减计数,预定标计数器产生下溢后项定时器的32位计数器(TIMH:
TIM)借位。
最后当定时器计数器(TIMH:
TIM)产生溢出使定时器向CPU发送中断。
定时器中断结构如下图所示:
图3.4定时器中断结构图
3.5.4定时中断流程图:
四、DSP实现原理图和PCB布线
4.1ICETEK-F2812-A器件分布图
ICETEK-F2812-A器件分布图如图4.1,本课程设计中应用了DSPF2812芯片
图4.1ICETEK–F2812-A器件分布图
4.2数字信号控制直流电机转速原理图和PCB布线图
我们利用ALTIUMDESIGENER设计了数字信号控制直流电机转速原理图
如图4.2和数字信号控制直流电机转速PCB布线图如图4.3。
图4.2数字信号控制直流电机转速原理图
图4.3数字信号控制直流电机转速PCB布线图
五、实验结果
最后我们通过程序设置调节改变ADC输入的波形或者传感器上采集到的模拟电压值,实现了调节信号发生器上的幅值调节旋钮来控制直流电机转速的控制,并且可以通过示波器观察到幅值的变化情况。
六、心得体会
DSP应用技术是一门实践性都强的专业课,主要都是通过实验在教学实验中掌握知识,只有通过不断的编程、仿真才能增强对软件方面的熟悉应用。
本文采用TI公司推出的TMS320F2812芯片作为直流电机控制系统的控制核心,依据该芯片特点、PWM调压调速原理,结合模数转换实验和直流电机控制实验,搭建了基于DSP的直流电机调速系统的实验平台,并在此基础上完成了系统的软、硬件设计,实现了通过调节波形的幅值来改变直流电机的调速功能。
由于整个电机控制所需的各种功能都是由DSP来实现的,因此,大幅度地减小了目标系统的体积,减少了外部元器件的个数,使得整个系统结构更加简单,功能更强,可靠性更高。
这次的课程设计跟我们以前做的实验不同,因为之前的实验只需要照着书上操作,这次是真真正正的两个人合作共同完成。
因为本课程设计要求跟书上有所不同,这样我们就必须要结合以前学习的知识,选择一个主题加以设计编程,弄懂实验的原理。
在实践中深深体会到哲学上理论对实践的指导作用:
弄懂实验原理,而且体会到了实验的操作能力是靠自己亲自动手,亲自开动脑筋,亲自去请教别人才能得到提高的。
本次课程设计中遇到的最大的难题是编程不会编,平时习惯的照着书上做,对编程部分练习少,这次需要自己设计自己编程,稍微有点程序改动就错误很多,导致了本次课程设计用时较多。
七、参考文献
[1]徐科军,陈志辉,傅大丰《TMS320F2812DSP应用技术》[M],北京:
科学出版社,2010年
[2]鲍建宇,裘君《DSP原理及应用乙—实验指导书》[M],浙江:
浙江大学宁波理工学院自动化与电气工程研究所,2015年
[3]《ICETEK-F2812-A教学实验指导书》[M],北京:
瑞泰创新
[4]苏奎峰,吕强,耿庆峰《TMS320F2812原理与开发》[M].北京:
电子工业出版,2006年
八、附录程序代码
源代码:
#include"
DSP281x_Device.h"
//DSP281xHeaderfileIncludeFile头文件定义
DSP281x_Examples.h"
//DSP281xExamplesIncludeFile
interruptvoidadc_isr(void);
//Prototypestatementsforfunctionsfoundwithinthisfile.
interruptvoidcpu_timer0_isr(void);
voidDelay(unsignedintnTime);
voidGpio_select(void);
voiderror(int);
voidprogram_stop();
voidGpio_PortA(void);
voidGpio_PortB(void);
voidGpio_PortF(void);
voidGpio_PortDEG(void);
charConvertScanToChar(unsignedcharcScanCode);
voidRefreshLEDArray();
//刷新显示
voidSetLEDArray(intnNumber);
//修改显示内容
#defineT46uS0x0d40
#defineCTRGR*(int*)0x108000
#defineCTRLCDCMDR*(int*)0x108001
#defineCTRKEY*(int*)0x108001
#defineCTRLCDCR*(int*)0x108002
#defineCTRCLKEY*(int*)0x108002
#defineCTRLCDLCR*(int*)0x108003
#defineCTRLCDRCR*(int*)0x108004
#defineCTRLA*(int*)0x108005
#defineCTRLR*(int*)0x108007
Uint16var1=0;
Uint16var2=0;
Uint16var3=0;
Uint16test_count=0;
Uint16Test_flag=0;
Uint16Test_var=0;
Uint16Test_status[32];
Uint16LoopCount;
Uint16ConversionCount;
Uint16Voltage1[1024];
Uint16Voltage2[1024];
Uint16PASS_flag=0;
unsignedintuWork;
intjishu=0;
定义变量
unsignedintuWork,nCount=0,uN,uN1,nCount1,nDir;
//
unsignedintuPort8000;
unsignedintnScreenBuffer[1024];
unsignedcharledbuf[8],ledx[8];
voidmain(void)//主函数
{
charcKey,cOldKey;
unsignedintnScanCode,nKeyCode;
unsignedintnSpeed;
InitSysCtrl();
//系统初始化,PLL时钟频率为150HZ
DINT;
//关闭中断,清除中断标志
InitPieCtrl();
//初始化PIE控制寄存器
IER=0x0000;
//关闭外设中断
IFR=0x0000;
//清除中断标志
InitPieVectTable();
EALLOW;
PieVectTable.ADCINT=&
adc_isr;
//将中断程序首地址放入中断向量
PieVectTable.TINT0=&
cpu_timer0_isr;
EDIS;
//关闭寄存器
AdcRegs.ADCTRL1.bit.RESET=1;
asm("
RPT#10||NOP"
);
AdcRegs.ADCTRL3.all=0x00C8;
AdcRegs.ADCTRL3.bit.ADCBGRFDN=0x3;
AdcRegs.ADCTRL3.bit.ADCPWDN=1;
PieCtrlRegs.PIEIER1.bit.INTx6=1;
CpuTimer0.RegsAddr=&
CpuTimer0Regs;
//定时器、控制寄存器设置
CpuTimer0Regs.PRD.all=0x3000;
CpuTimer0Regs.TPR.all=0;
CpuTimer0Regs.TIM.all=0;
CpuTimer0Regs.TPRH.all=0;
CpuTimer0Regs.TCR.bit.TSS=1;
CpuTimer0Regs.TCR.bit.SOFT=1;
CpuTimer0Regs.TCR.bit.FREE=1;
CpuTimer0Regs.TCR.bit.TRB=1;
CpuTimer0Regs.TCR.bit.TIE=1;
CpuTimer0.InterruptCount=0;
IER|=M_INT1;
//对应的CPU中断
PieCtrlRegs.PIEIER1.bit.INTx7=1;
EINT;
//使能
ERTM;
CTRGR=0x80;
//初始化ICETEK-CTR
CTRGR=0x0;
CTRLR=0;
//关闭东西方向的交通灯
CTRLR=0x40;
//关闭南北方向的交通灯
CTRLR=0xC0;
CTRGR=0x81;
LoopCount=0;
ConversionCount=0;
AdcRegs.ADCMAXCONV.all=0x0001;
//Setup2conv'
sonSEQ1
AdcRegs.ADCCHSELSEQ1.bit.CONV00=0x0;
//SetupADCINA3as1stSEQ1conv.
AdcRegs.ADCCHSELSEQ1.bit.CONV01=0x1;
//SetupADCINA2as2ndSEQ1conv.
AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=1;
//EnableEVASOCtostartSEQ1
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1;
//EnableSEQ1interrupt(everyEOS)
EvaRegs.T1CMPR=0x0080;
//SetupT1comparevalue
EvaRegs.T1PR=0x10;
//Setupperiodregister
EvaRegs.GPTCONA.bit.T1TOADC=1;
//EnableEVASOCinEVA
EvaRegs.T1CON.all=0x1042;
//Enabletimer1compare(upcountmode)
uPort8000=CTRCLKEY;
Gpio_PortA();
Gpio_PortB();
nSpeed=T46uS;
uN=60;
nCount=nCount1=0;
nDir=0;
cKey=cOldKey=0;
初始化,转速设为60
StartCpuTimer0();
//启动定时器
//uN设置为直流电机转速
interruptvoidcpu_timer0_isr(void)
CpuTimer0.InterruptCount++;
//Acknowledgethisinterrupttoreceivemoreinterruptsfromgroup1
PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;
//清零PIEACK第一组中断
CpuTimer0Regs.TCR.bit.TIF=1;
//定时器控制寄存器设置为1
GpioDataRegs.GPBSET.bit.GPIOB4=1;
//设置脉冲输出为高电平
GpioDataRegs.GPASET.bit.GPIOA0=1;
GpioDataRegs.GPBDAT.bit.GPIOB4=(nCount1<
uN)?
1:
0;
GpioDataRegs.GPADAT.bit.GPIOA0=(nCount1<
nCount1++;
nCount1%=100;
//设置初始高电平脉宽
}
voidDelay(unsignedintnDelay)//定时器时间设置
{
intii,jj,kk=0;
for(ii=0;
ii<
nDelay;
ii++)
for(jj=0;
jj<
64;
jj++)
{
//RefreshLEDArray();
kk++;
}
voidRefreshLEDArray()
inti;
for(i=0;
i<
8;
i++)
CTRGR=ledx[i];
CTRLA=ledbuf[i];
voidGpio_PortA(void)
var1=0x0000;
//setsGPIOMuxsasI/Os
var2=0x00FF;
//setsGPIO15-8DIRasinputs,7-0DIRasoutputs
var3=0x0000;
//Don'
tsetanyinputqualifier
Gpio_select();
test_count=0;
Test_status[Test_var]=0x0002;
Test_var++;
Test_status[Test_var]=0xD0BE;
//Setthedefaultvalueofstatus
//to"
PASSED"
GpioDataRegs.GPACLEAR.all=0x00FF;
//TestClear
RPT#5||NOP"
GpioDataRegs.GPASET.bit.GPIOA4=1;
voidGpio_PortB(void)
//setsGPIOMuxsasI/Os
GpioDataRegs.GPBCLEAR.all=0x00FF;
voidGpio_select(void)
GpioMuxRegs.GPAMUX.all=var1;
//ConfigureMUXsasdigitalI/Osor
GpioMuxRegs.GPBMUX.all=var1;
//peripheralI/Os
GpioMuxRegs.GPDMUX.all=var1;
GpioMuxRegs.GPFMUX.all=var1;
GpioMuxRegs.GPEMUX.all=var1;
//var1=0x0000,前面有设置
GpioMuxRegs.GPGMUX.all=var1;
GpioMuxRegs.GPADIR.all=var2;
//GPIOPORTs作为输出口
GpioMuxRegs.GPBDIR.all=var2;
//GPIODIRselectGPIOsasoutput
GpioMuxRegs.GPDDIR.all=var2;
//var2=0x00FF,前面有设置
GpioMuxRegs.GPEDIR.all=var2;
GpioMuxRegs.GPFDIR.all=var2;
GpioMuxRegs.GPGDIR.all=var2;
GpioMuxRegs.GPAQUAL.all=var3;
//SetGPIOinputqualifiervalues
GpioMuxRegs.GPBQUAL.all=var3;
GpioMuxRegs.G