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

下载本文档

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

文档简介

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

2、2 程序模块83.3.3程序设计结果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的结果显示出来,当输入电压变化时, 显示值也变化。2.4编

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

4、if(KEY=0) key_number=Read_7281(0x13);/读取按键值 switch(key_number) case 0x00: keynumber+; if(keynumber>9999)keynumber=0; write(); delay(2); break; case 0x01: keynumber-; if(keynumber<0)keynumber=9999; write(); delay(2); break; /switch /if while(KEY=0) /如果按键没有松开,则开始计时; if(time<=5) /延时环节,延时为1秒; f

5、or(cnt1=0;cnt1<270;cnt1+) for(cnt2=0;cnt2<10000;cnt2+) if(KEY!=0) break; if(KEY!=0)break; /如果按键松开,则跳出循环,重新开始计时; if(KEY!=0)break; time+; /如果1秒内按键未松开,则计时变量time加1; cnt1=cnt2=0;if(time>=1&&time<=5) /按着不放超过1秒,则不断加1或减1; switch(key_number) case 0x00: keynumber+; if(keynumber>9999)key

6、number=0; write(); break; case 0x01: keynumber-; If(keynumber<0)keynumber=9999; write(); break; default : break; if(time>5) /按着不放超过5秒,则不断加10或减10; switch(key_number) case 0x00: keynumber+=10; if(keynumber>9999)keynumber=0; write(); delay(15); break; case 0x01: keynumber-=10; if(keynumber<

7、0)keynumber=9999; write(); delay(15); break; default : break; /for3.2 AD采样程序3.2.1程序设计思路此程序相对简单,只需要用ADC中断获取通道的采样值,再将采样值在数码管上显示即可。3.2.2 程序模块/ADC中断,获取通道采样值;interrupt void adc_isr(void) Voltage00 = AdcResult.ADCRESULT0;/ 模数转换结果由 ADCINA0 通道采样产生 Voltage01 = AdcResult.ADCRESULT1;/ 模数转换结果由 ADCINA1 通道采样产生 Vo

8、ltage02 = AdcResult.ADCRESULT2;/ 模数转换结果由 ADCINA2 通道采样产生 Voltage03 = AdcResult.ADCRESULT3;/ 模数转换结果由 ADCINA3 通道采样产生 Voltage04 = AdcResult.ADCRESULT4;/ 模数转换结果由 ADCINA4 通道采样产生/ 28027 缺 ADCINA5 ADCRESULT5 Voltage05 = AdcResult.ADCRESULT6;/ 模数转换结果由 ADCINA6 通道采样产生 Voltage06 = AdcResult.ADCRESULT7;/ 模数转换结果由

9、 ADCINA7 通道采样产生/ 28027 缺 ADCINB0 ADCRESULT8 Voltage07 = AdcResult.ADCRESULT9;/ 模数转换结果由 ADCINB1 通道采样产生 Voltage08 = AdcResult.ADCRESULT10;/ 模数转换结果由 ADCINB2 通道采样产生 Voltage09 = AdcResult.ADCRESULT11;/ 模数转换结果由 ADCINB3 通道采样产生 Voltage010 = AdcResult.ADCRESULT12;/ 模数转换结果由 ADCINB4 通道采样产生/ 28027 缺 ADCINB5 ADC

10、RESULT13 Voltage011 = AdcResult.ADCRESULT14;/ 模数转换结果由 ADCINB6 通道采样产生 Voltage012 = AdcResult.ADCRESULT15;/ 模数转换结果由 ADCINB7 通道采样产生 AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;/Clear ADCINT1 flag reinitialize for next SOC PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; / Acknowledge interrupt to PIE return;/for循环 for

11、(;) /计算每一位的数值,并显示; qw = Voltage00/1000;bw = (Voltage00 - 1000*qw)/100;sw = (Voltage00 - 1000*qw - 100*bw)/10;gw = Voltage00 - 1000*qw - 100*bw - 10*sw;qw1 = Voltage01/1000;bw1 = (Voltage01 - 1000*qw1)/100;sw1 = (Voltage01 - 1000*qw1 - 100*bw1)/10;gw1 = Voltage01 - 1000*qw1 - 100*bw1 - 10*sw1; Write_

12、7281(0x15,(0x70+qw); / 向最右边算起第8位写0 Write_7281(0x15,(0x60+bw);/ 向最右边算起第7位写0 Write_7281(0x15,(0x50+sw);/ 向最右边算起第6位写0 Write_7281(0x15,(0x40+gw); / 向最右边算起第5位写0 Write_7281(0x15,(0x30+qw1); / 向最右边算起第4位写0 Write_7281(0x15,(0x20+bw1);/ 向最右边算起第3位写0 Write_7281(0x15,(0x10+sw1);/ 向最右边算起第2位写0 Write_7281(0x15,(0x0

13、0+gw1);/ 向最右边算起第1位写0delay(3); 3.3 6路PWM正弦波程序3.3.1 程序设计思路PWM开关频率和死区的设置,可以在InitEPwm1Example(),这个函数中通过对周期寄存器赋值来控制开关频率,死区则通过对Raising Edge Delay 和Failing Edge Delay 赋值来设置。程序要求开关频率为10KHZ,而28027主频为60MHZ,由于60M/3000/2=10K,故周期寄存器赋值3000;程序要求死区为2us,故只需将上升沿延迟和下降沿延迟均设定为1us即可。输出波形为正弦波,即要求占空比按正弦变化,本组通过查表(表中数据按正弦变化)

14、,来进行脉宽调制。对于频率的控制,首先按50HZ为基准,要求每次步长为1 查表,将表中数据查完一遍,输出的波形即为50HZ。则由于开关频率为10KHZ,10K/50=200,所以正弦表中应含有200个数值,且数值大小按正弦变化。当频率小于50HZ时,按F/50这一比例系数为步长进行查表,由于F<50,故查表较慢,即输出波形的频率变小。当频率大于50HZ时,也按F/50这一比例系数为步长进行查表,由于此时F>50,故查表较快,即输出波形频率变大。对与V/f为常数,则可通过简单的运算即可实现。3.3.2 程序模块/正弦表/Sin table , Max Value 4096 , Min

15、 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,3854,3883,3911,3937,3961,3983,4003,4021,4037,4051,4063,4074,4082,4088,4092,4095,4095,4093,4089

16、,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,2406,2342,2279,2215,2150,2086,2022,1957,1893,1829,1765,1702,1639,1576,1513,1452,1390,1330,1270

17、,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,406,446,486,529,573,618,665,713,762,813,865,918,972,1027,1084,1141,1199,1258,1318,1378,1439,1

18、501,1563,1626,1689,1753,1816,1880,1945,2009;/此即为正弦表,此表中数据按正弦规律变化,通过查表可以控制占空比,即控制电压大小,通过改变查表的快慢即可控制输出波形的频率。/EPWM1配置/10KHz : 60M / 3000 / 2 = 10K center-aligned#define EPWM1_TIMER_TBPRD 3000 / Period register 周期寄存器赋值3000#define EPWM2_TIMER_TBPRD 3000 / Period register#define EPWM3_TIMER_TBPRD 3000 / P

19、eriod registervoid InitEPwm1Example() / Setup TBCLK EPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD; / Set timer period 801 TBCLKs / 周期寄存器值为3000,60M/3000/2=10K ; 即开关频率设置为10KHZ; EPwm1Regs.TBPHS.half.TBPHS = 0x0000; / Phase is 0 EPwm1Regs.TBCTR = 0x0000; / Clear counter EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENAB

20、LE; EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;/Toggle EPWM1B only EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL;/Delay on Raising and Faling EPwm1Regs.DBRED = 120;/1us deadband EPwm1Regs.DBFED = 120; /死区配置,RED和FED均设置为1us,即死区时间为2us; /for循环 for(;) FreqFloat = ADCResults0/38; /频率与通道采样值乘正比,除以38是为了控制频率调节范围为0100HZ

21、; FreqInt = (unsigned int) FreqFloat; th = (FreqInt%100)/10; /将频率输出在数码管上; Write_7281(0x15,(0x50+th); th = FreqInt%10; Write_7281(0x15,(0x40+th); Delay(2); asm(" NOP"); /EPWM中断函数interrupt void epwm1_isr(void) / Update the CMPA and CMPB values / update_compare(&epwm1_info); unsigned int

22、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(FreqInt > 50) i

23、= (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%幅值; else i = (unsigned short) (float) FreqInt * 2 * sin_tablePhaseAPosition % 200 / 137.0f); j = (unsigned short) (float) FreqInt * 2 * sin_table(PhaseAPosition + 133) % 200 / 137.0f); k = (unsigned short) (float) FreqInt * 2 * sin_table

温馨提示

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

评论

0/150

提交评论