当前位置:文档之家› 电机的DSP控制课程设计报告

电机的DSP控制课程设计报告

课程名称:电机的DSP控制课程设计院系:电子信息与电气工程学院专业:电气工程与自动化班级:学号:姓名:上海交通大学目录1. 电机控制的DSP芯片 (3)2.软件设计要求 (3)2.1学会DSP开发环境的使用,能编写C语言程序; (3)2.2编写数码管显示程序、键盘扫描程序; (3)2.3 编写AD采样程序; (3)2.4编写6路PWM正弦波程序(变频器逆变需6路); (3)3. 软件实现 (3)3.1数码管显示程序、键盘扫描程序 (3)3.1.1程序设计思路 (3)3.1.2程序模块 (4)3.2 AD采样程序 (6)3.2.1程序设计思路 (6)3.2.2 程序模块 (6)3.3 6路PWM正弦波程序 (7)3.3.1 程序设计思路 (7)3.3.2 程序模块 (8)3.3.3程序设计结果 (10)4. 课程总结 (14)1.电机控制的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编写6路PWM正弦波程序(变频器逆变需6路);PWM的开关频率为10KHz,其输出的正弦波频率为0~100Hz,根据AD的值变化,50Hz时输出100%电压,0~50Hz按V/f等于常数输出,死区时间取2us。

频率值显示在数码管上。

3.软件实现3.1数码管显示程序、键盘扫描程序3.1.1程序设计思路此程序关键是如何去计时,最初考虑是用计时器中断去设计程序,但此方法需要在中断中执行判断按键是否持续,以及更改和现实数字,中断中操作过多,经常出错。

故后来改为用延时环节计时,此方法的优点是不需要用中断,但计时不够精确。

3.1.2程序模块for(;;){ time=0; //计时变量time初始值为0;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}//ifwhile(KEY==0) //如果按键没有松开,则开始计时;{if(time<=5) //延时环节,延时为1秒;{for(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)keynumber=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<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){V oltage0[0] = AdcResult.ADCRESULT0; // 模数转换结果由ADCINA0 通道采样产生V oltage0[1] = AdcResult.ADCRESULT1; // 模数转换结果由ADCINA1 通道采样产生V oltage0[2] = AdcResult.ADCRESULT2; // 模数转换结果由ADCINA2 通道采样产生V oltage0[3] = AdcResult.ADCRESULT3; // 模数转换结果由ADCINA3 通道采样产生V oltage0[4] = AdcResult.ADCRESULT4; // 模数转换结果由ADCINA4 通道采样产生// 28027 缺ADCINA5 ADCRESULT5V oltage0[5] = AdcResult.ADCRESULT6; // 模数转换结果由ADCINA6 通道采样产生V oltage0[6] = AdcResult.ADCRESULT7; // 模数转换结果由ADCINA7 通道采样产生// 28027 缺ADCINB0 ADCRESULT8V oltage0[7] = AdcResult.ADCRESULT9; // 模数转换结果由ADCINB1 通道采样产生V oltage0[8] = AdcResult.ADCRESULT10; // 模数转换结果由ADCINB2 通道采样产生V oltage0[9] = AdcResult.ADCRESULT11; // 模数转换结果由ADCINB3 通道采样产生V oltage0[10] = AdcResult.ADCRESULT12; // 模数转换结果由ADCINB4 通道采样产生// 28027 缺ADCINB5 ADCRESULT13V oltage0[11] = AdcResult.ADCRESULT14; // 模数转换结果由ADCINB6 通道采样产生V oltage0[12] = AdcResult.ADCRESULT15; // 模数转换结果由ADCINB7 通道采样产生AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //Clear ADCINT1 flag reinitialize for next SOC PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // Acknowledge interrupt to PIEreturn;}//for循环for(;;) //计算每一位的数值,并显示;{qw = V oltage0[0]/1000;bw = (V oltage0[0] - 1000*qw)/100;sw = (V oltage0[0] - 1000*qw - 100*bw)/10;gw = V oltage0[0] - 1000*qw - 100*bw - 10*sw;qw1 = V oltage0[1]/1000;bw1 = (V oltage0[1] - 1000*qw1)/100;sw1 = (V oltage0[1] - 1000*qw1 - 100*bw1)/10;gw1 = V oltage0[1] - 1000*qw1 - 100*bw1 - 10*sw1;Write_7281(0x15,(0x70+qw)); // 向最右边算起第8位写0Write_7281(0x15,(0x60+bw)); // 向最右边算起第7位写0Write_7281(0x15,(0x50+sw)); // 向最右边算起第6位写0Write_7281(0x15,(0x40+gw)); // 向最右边算起第5位写0Write_7281(0x15,(0x30+qw1)); // 向最右边算起第4位写0Write_7281(0x15,(0x20+bw1)); // 向最右边算起第3位写0Write_7281(0x15,(0x10+sw1)); // 向最右边算起第2位写0Write_7281(0x15,(0x00+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即可。

输出波形为正弦波,即要求占空比按正弦变化,本组通过查表(表中数据按正弦变化),来进行脉宽调制。

对于频率的控制,首先按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 Value 0unsigned short sin_table[200]={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,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,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,1501,1563,1626,1689,1753,1816,1880,1945,2009};//此即为正弦表,此表中数据按正弦规律变化,通过查表可以控制占空比,即控制电压大小,通过改变查表的快慢即可控制输出波形的频率。

相关主题