电机的DSP控制课程设计报告_第1页
电机的DSP控制课程设计报告_第2页
电机的DSP控制课程设计报告_第3页
电机的DSP控制课程设计报告_第4页
电机的DSP控制课程设计报告_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课程名称:电机的DSP空制课程设计院 系:电子信息与电气工程学院 专 业:电气工程与自动化 班 级:学 号:姓 名:上海交通大学目录1. 电机控制的DSP芯片3.2. 软件设计要求 3.2.1学会DSP开发环境的使用,能编写 C语言程序; 32.2编写数码管显示程序、键盘扫描程序; 32.3编写AD采样程序;3.2.4编写6路PWM正弦波程序(变频器逆变需 6路); 33. 软件实现3.3.1数码管显示程序、键盘扫描程序 33.1.1程序设计思路程序模块4.3.2 AD采样程序程序设计思路程序模块6.3.3 6路PWM正弦波程序73.3.1程序设计思路

2、程序模块程序设计结果104. 课程总结141. 电机控制的DSP芯片本课程设计用的芯片为TMS320F28027;本课程设计中主要用到的一些电路模块:显示和键盘电路、BC7281、A/D采样电路、PWM输出电路。2. 软件设计要求2.1学会DSP开发环境的使用,能编写 C语言程序;2.2编写数码管显示程序、键盘扫描程序;程序运行后,初始值为0,通过1个键,按一下加1,通过另一个 键,按1下减1;(按着不放,超过1秒,不断加1或减1,时间 超过5秒,不断加10,或减10)。2.3编写AD采样程序;根据输入的电压值,把AD的结果显示出来,当输入电压变化时, 显示值也变化

3、。2.4编写6路PWM正弦波程序(变频器逆变需6路);PWM的开关频率为10KHZ,其输出的正弦波频率为 0100Hz,根据AD的值变化,50Hz时输出100%电压,050Hz按V/f等于常数输出,死区时间取2us。频率值显示在数码管上。3. 软件实现3.1数码管显示程序、键盘扫描程序3.1.1程序设计思路此程序关键是如何去计时,最初考虑是用计时器中断去设计程序,但此方法需要在中断中执行判断按键是否持续,以及更改和现实数字,中断中操作过多,经常出错。故后来改为用延时环节计时,此方法的优点是不需要用中断,但计时不够精确。3.1.2程序模块for(;) time=O;/计时变量time初始值为0;

4、if(KEY=O) key_number=Read_7281(0x13);读取按键值switch(key_number)case 0x00:keynumber+;if(keynumber9999)keynumber=0;write();dela y(2);break;case 0x01: keynumber-;if(keynumber0)keynumber=9999;write();dela y(2);break;/switch/ifwhile(KEY=0)如果按键没有松开,则开始计时;if(time=5)/延时环节,延时为 1秒;for(cnt1=0;cnt1270;cnt1+)for(cn

5、t2=0;cnt2=1 &time9999)keynumber=0;write();break;case 0x01:keynumber-;lf(keynumber5)按着不放超过5秒,则不断加10或减10;switch(key_number)case 0x00:keynumber+=10;if(keynumber9999)keynumber=0;write();delay(15);break;case 0x01:keynumber-=10;if(keynumber0)keynumber=9999;write();delay(15);break;default : break;/for3.2 A

6、D采样程序3.2.1程序设计思路此程序相对简单,只需要用 ADC中断获取通道的采样值,再将采样 值在数码管上显示即可。3.2.2程序模块/ADC中断,获取通道采样值;interrupt void adc_isr(void)Voltage010 = AdcResult.ADCRESULT12;Voltage011 = AdcResult.ADCRESULT14;Voltage012 = AdcResult.ADCRESULT15;AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;/模数转换结果由 ADCINB4通道采样产生/ 28027 缺 ADCINB5 ADCRESU

7、LT13/模数转换结果由 ADCINB6通道采样产生/模数转换结果由 ADCINB7通道采样产生/Clear ADCINT1 flag reinitialize for next SOCVoltage00 = AdcResult.ADCRESULT0;/模数转换结果由ADCINA0通道采样产生Voltage01 = AdcResult.ADCRESULT1;/模数转换结果由ADCINA1通道采样产生Voltage02 = AdcResult.ADCRESULT2;/模数转换结果由ADCINA2通道采样产生Voltage03 = AdcResult.ADCRESULT3;/模数转换结果由ADCI

8、NA3通道采样产生Voltage04 = AdcResult.ADCRESULT4;/模数转换结果由ADCINA4通道采样产生/ 28027缺 ADCINA5 ADCRESULT5Voltage05 = AdcResult.ADCRESULT6;/模数转换结果由ADCINA6通道采样产生Voltage 06 = AdcResult.ADCRESULT7;/模数转换结果由ADCINA7通道采样产生/ 28027缺 ADCINB0 ADCRESULT8Voltage07 = AdcResult.ADCRESULT9;/模数转换结果由ADCINB1通道采样产生Voltage08 = AdcResul

9、t.ADCRESULT10;/模数转换结果由ADCINB2通道采样产生Voltage09 = AdcResult.ADCRESULT11;/模数转换结果由ADCINB3通道采样产生/ Acknowledge interrupt to PIEPieCtrIRegs.PIEACK.all = PIEACK_GROUP1; return;/for循环for(;)/计算每一位的数值,并显示;qw = Voltage00/1000;bw = (Voltage00 - 1000*qw)/100;sw = (Voltage00 - 1000*qw - 100*bw)/10;gw = Voltage00 -

10、1000*qw - 100*bw - 10*sw;qw1 = Voltage01/1000;bw1 = (Voltage01 - 1000*qw1)/100;sw1 = (Voltage01 - 1000*qw1 - 100*bw1)/10;100*bw1 - 10*sw1;/向最右边算起第8位写0/向最右边算起第7位写0/向最右边算起第6位写0/向最右边算起第5位写0/向最右边算起第4位写0/向最右边算起第3位写0/向最右边算起第2位写0/向最右边算起第1位写0gw1 = Voltage01 - 1000*qw1Write_7281(0x15,(0x70+qw);Write_7281(0x1

11、5,(0x60+bw);Write_7281(0x15,(0x50+sw);Write_7281(0x15,(0x40+gw);Write_7281(0x15,(0x30+qw1);Write_7281(0x15,(0x20+bw1);Write_7281(0x15,(0x10+sw1);Write_7281(0x15,(0x00+gw1);delay(3);3.3 6路PWM正弦波程序3.3.1程序设计思路PWM开关频率和死区的设置,可以在InitEPwm1Example(),这个函数中通过对周期寄存器赋值来控制开关频率,死区则通过对Rais ingEdge Delay和Failing Ed

12、ge Delay赋值来设置。程序要求开关频率为 10KHZ,而 28027 主频为 60MHZ,由于 60M/3000/2=10K,故周期寄存器赋值3000;程序要求死区为2us,故只需将上升沿延迟和下降沿 延迟均设定为1us即可。输出波形为正弦波,即要求占空比按正弦变化,本组通过查表(表中 数据按正弦变化),来进行脉宽调制。对于频率的控制,首先按50HZ 为基准,要求每次步长为1查表,将表中数据查完一遍,输出的波 形即为50HZ。则由于开关频率为10KHZ,10K/50=200,所以正弦表 中应含有200个数值,且数值大小按正弦变化。当频率小于50HZ时,按F/50这一比例系数为步长进行查表

13、,由于 F50,故查表较快,即输出波形频率 变大。对与V/f为常数,则可通过简单的运算即可实现。332程序模块 正弦表/Sin table , Max Value 4096 , Min Value 0unsigned short sin_table200=2073,2138,2202,2266,2330,2393,2456,2519,2582,2643,2705,2765,2825,2884,2942,3000,3056,3112,3166,3220,3272,3323,3372,3421,3468,3513,3558,3600,3641,3681,3719,3755,3790,3823,38

14、54,3883,3911,3937,3961,3983,4003,4021,4037,4051,4063,4074,4082,4088,4092,4095,4095,4093,4089,4083,4075,4066,4054,4040,4024,4006,3987,3965,3942,3916,3889,3860,3829,3797,3762,3726,3689,3649,3609,3566,3522,3477,3430,3382,3333,3282,3230,3177,3123,3068,3011,2954,2896,2837,2777,2717,2656,2594,2532,2469,24

15、06,2342,2279,2215,2150,2086,2022,1957,1893,1829,1765,1702,1639,1576,1513,1452,1390,1330,1270,1211,1153,1095,1039,983,929,875,823,772,723,674,627,582,537,495,454,414,376,340,305,272,241,212,184,158,134,112,92,74,58,44,32,21,13,7,3,0,0,2,6,12,20,29,41,55,71,89,108,130,153,179,206,235,266,298,333,369,4

16、06,446,486,529,573,618,665,713,762,813,865,918,972,1027,1084,1141,1199,1258,1318,1378,1439,1501,1563, 1626,1689,1753,1816,1880,1945,2009;此即为正弦表,此表中数据按正弦规律变化,通过查表可以控制占空比,即控制电压大小,通过改变查 表的快慢即可控制输出波形的频率。/EPWM1 配置10KHz : 60M / 3000 / 2 = 10K center-aligned#define EPWM1_TIMER_TBPRD#define EPWM2_TIMER_TBPR

17、D#define EPWM3_TIMER_TBPRD3000/Periodregister周期寄存器赋值30003000/Periodregister3000/Periodregister void lnitEPwm1Example()/ Setup TBCLKEPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD; / Set timer period 801 TBCLKs/周期寄存器值为 3000,60M/3000/2=10K ; 即开关频率设置为 10KHZ ;EPwm1Regs.TBPHS.half.TBPHS = 0x0000;/ Phase is 0EPwm1Reg

18、s.TBCTR = 0x0000;/ Clear counterEPwm1Regs.DBCTL.bit.0UT_M0DE = DB_FULL_ENABLE;EPwmIRegs.DBCTL.bit.POLSEL = DB_ACTV_HIC;/Toggle EPWM1B onlyEPwm1Regs.DBCTL.bitN_MODE = DBA_ALL;/Delay on Raising and FalingEPwm1Regs.DBRED = 120;/1us deadbandEPwm1Regs.DBFED = 120;死区配置,RED和FED均设置为1us,即死区时间为 2us;/for循环for(

19、;)FreqFloat = ADCResults0/38;0100HZ;频率与通道采样值乘正比,除以38是为了控制频率调节范围为FreqInt = (unsigned int) FreqFloat;th = (FreqInt%100)/10;将频率输出在数码管上;Write_7281(0x15,(0x50+th);th = Freqlnt%10;Write_7281(0x15,(0x40+th);Dela y(2);asm(NOP);/EPWM中断函数interrupt void epwm1sr(void)/ Update the CMPA and CMPB values/ update_co

20、mpare(&epwm1_info);unsigned int PhaseAPosition;unsigned short i,j,k;InterruptedTimes+;PWMStep = FreqFloat/50.0;设置查表的步长,以50HZ为基准;PhaseAPositionHistory += PWMStep;/ 按步长依次查表;if( PhaseAPositionHistory 200) PhaseAPositionHistory -= 200; 若超过 200,则循环PhaseAPosition = (unsigned int)PhaseAPositionHistory;if(F

21、reqInt 50)i = (unsigned short) (float) sin_tablePhaseAPosition % 200 / 1.37f);j = (unsigned short) (float) sin_table(PhaseAPosition + 133) % 200 / 1.37f);k = (unsigned short) (float) sin_table(PhaseAPosition + 67 ) % 200 / 1.37f);/ /频率大于50HZ时的变换式,输出电压为100%幅值;elsei = (unsigned short) (float) FreqInt

22、* 2 * sin_tablePhaseAPosition % 200 / 137.0f); j = (unsigned short) (float) Freqlnt * 2 * sin_table(PhaseAPosition + 133) % 200 / 137.0f); k = (unsigned short) (float) FreqInt * 2 * sin_table(PhaseAPosition + 67 ) % 200 / 137.0f);/频率小于50HZ时所用的变换式,保证了电压变化在50HZ处的连续,也保证了V/f为常数;if(PWMEnabled)/设置各路 PWM 的占空比;EPwm1Regs.CMPA.half.CMPA = i;EPwm2Regs.CMPA.half.CMPA = j;EPwm3Regs.CMPA.half.CMPA = k;/EPwmIRegs.CMPB = i;/ Set Compare B value/ Clear INT flag for this timerEPwm1Regs.ETCLR.bit.INT = 1;/ 清中断标志位/ Acknowledge this interrupt to receive more interrupts from group 3PieCtrlRegs.PIEACK.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论