系统控制代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
系统控制代码
/*
不知道你是要写转速闭环控制程序还是功能测试时计算转速。
如测试时计算转速:
1.可用转速计直接测试
2.可用示波器看反电动势波形的频率进行计算。频率/极对数*60即为每分钟转速。
如是写转速闭环控制程序,这个比较复杂。分为加速/减速/匀速三种情况来写。
一般为连续换12次相/2即为一圈时间(以三相六极匀速为例)。
转速=60*F/磁极,F为电源频率,一般为50,磁极SN为1
3.?同步电动机的转速=60*频率/?极对数(我国工频为50Hz)
异步电动机转速=(60*频率/?极对数)×转差率
电机转速与频率的公式?n=60f/p?上式中?
n——电机的转速(转/分);?60——每分钟(秒);?f——电源频率(赫芝);?p——电机旋转磁场的极对数。?
*/
/*
由于一个特定的优先级可被分配给多个中断请求源,因此提供了一种解决给定用户分配优先级内优先级冲突的方法。
每个中断源都有一个自然顺序优先级,这由其在IVT中的位置决定。表28-2给出了每个中断源在IVT中的位置。中断向量的编号越低
,其自然优先级越高,而向量的编号越高,其自然优先级越低。任何待处理的中断源的总优先级都
首先由该中断源在中断优先级控制(IPCx)寄存器中的用户分配优先级决定,然后由IVT中的自然顺序优先级决定。
自然顺序优先级仅用于解决具有相同用户分配优先级而同时等待处理的中断之间的冲突。一旦解决了优先级冲突,
异常处理过程就开始了,CPU只能被具有更高用户分配优先级的中断源中断。在异常处理过程开始后才等待处理的中断,
如果它与当前正在处理的中断具有相同的用户分配优先级,即便具有较高的自然顺序优先级,
也将保持待处理状态直到当前的异常处理过程结束
*/
#define __dsPIC30F2010__
#include <p30f2010.h>
#define FCY 10000000
/*FCY为指令周期时钟频率xtal = 5.0Mhz; PLLx8
板子上接的晶振为5MHz,5MHz/4*8=10^7;
*/
#define MILLISEC FCY/10000 // 1 mSec delay constant
#define FPWM 39000
#define POLEPAIRS 2 // 转子的极对数;number of pole pairs of the motor
#define INDEX 1 // 转子的起始位置;Hall sensor position index
#define S2 !PORTCbits.RC14
#define S3 !PORTCbits.RC13
#define CR 0x0D
#define LF 0x0A
#define BAUD 19200
#define SPEEDMULT 2343750 // 10^7*60/256=2343750;factor used to calculate speed #define OFFSET 8 // offset in InData to load speed values
#define POTMULT 4 //电位器的AD转换系数: pot to speed ratio
#define Kps 750 // Kp and Ks terms need to be adjusted as per
#define Kis 20 // the motor and load
void InitADC10(void);
void AverageADC(void);
void DelayNmSec(unsigned int N);
void InitMCPWM(void);//电机控制模块初始化
void InitUART(voi
d);
void SendSpeed(void);
void InitTMR3(void);
void SendMsg(void);
void CalculateDC(void);//PID调节函数
struct {
unsigned RunMotor : 1;//电机运行标志
unsigned CalSpeed : 1; //速度调节标志
unsigned CheckRX : 1;
unsigned SendTX : 1;
unsigned unused : 12;
} Flags;
unsigned int HallValue;
unsigned int timer3value;
unsigned int timer3avg;
unsigned char polecount;
unsigned char *TXPtr;
unsigned char *RXPtr;
int DesiredSpeed;
int ActualSpeed;
int SpeedError;
int DutyCycle;
int SpeedIntegral;
int timeout;//TMR2定时器中断溢出的次数,从而达到计时的目的
unsigned char InData[] = {"000000"};
unsigned char OutData[] = {"Speed = 00000 rpm\r\n"};
/*通过看这个OutData这个数组可以看到当在这个数组的第九个字符的时候是要设定的speed的值。这也是OFFSET=8的原因,
*/
unsigned int StateTable[] = {0x0000, 0x0210, 0x2004, 0x0204,
0x0801, 0x0810, 0x2001, 0x0000};
/*************************************************************
Low side driver table is as below. In the StateLoTableClk,
the Low side driver is a PWM while the high side driver is
either on or off.
*************************************************************/
unsigned int StateLoTableClk[] = {0x0000, 0x0210, 0x2004, 0x0204,
0x0801, 0x0810, 0x2001, 0x0000};
unsigned int StateLoTableAntiClk[] = {0x0000, 0x2001, 0x0810, 0x0801,
0x0204, 0x2004, 0x0210, 0x0000};