资源简介

该代码需要复制到非中文路径下,使用开发环境MPLAB IDE 8.01或更高版本。 该开发环境需安装有MCC30编译器。

资源截图

代码片段和文件信息


//---------------------------------------------------------------------------------------------------------
// 文件名: ClosedLoop.c
//
//  工程节点包括以下三个: 
// 1. 主节点:              CloseLoop.c   
// 2. 芯片链接器描述文件:  p30f3010.gld  
//      3. PID运算汇编节点:     PID.s
//---------------------------------------------------------------------------------------------------------

#include 

//--------------------------芯片配置字设置-------------------------------
_FOSC(CSW_FSCM_OFF & XT_PLL16);
_FWDT(WDT_OFF);
_FBORPOR(PBOR_ON & BORV_20 & PWRT_64 & MCLR_EN);
//-----------------------------------------------------------------------

typedef signed int SFRAC16;

#define FCY  20000000       // xtal = 5Mhz; PLLx16 -> 20 MIPS (运行速度20MIPS)
#define FPWM 19531       // PWM频率设置为19.5 kHz 避免产生人能听到的噪音
#define _10MILLISEC 10
#define _50MILLISEC 50
#define _100MILLISEC 100
#define _500MILLISEC 500

#define HALLA 1 // RB3
#define HALLB 2 // RB4
#define HALLC 4 // RB5
#define CW 0 // 电机顺时针方向(CCW)转动标志位
#define CCW 1 // 电机反时针方向( CW)转动标志位
#define Switch_2 (!PORTCbits.RC14)

// 计算周期 Period = TMRClock * 6 / RPM
// 例如转速 RPM = 6000 (最大速度)
// 周期     Period = (20000000 / 64) * 6 / 6000 = 312.5
//          RPM = 60 (最小转速)
// 周期     Period = (20000000 / 64) * 6 / 60 = 31250

#define MINPERIOD 313 // 对于 6000 max rpm 和 10 极电机
#define MAXPERIOD 31250 // 对于 60 min rpm 和 10 极电机
#define MINABSSPEED 327
#define MAXABSSPEED 32663

// 当使用floats来初始化有符号16-bit小数变量时使用这个宏  
#define SFloat_To_SFrac16(Float_Value) (((Float_Value)<0.0)?(SFRAC16)(32768*(Float_Value)-0.5):(SFRAC16)(32767*(Float_Value)+0.5))

void SixStepComm(int _Current_Sector int _Required_Voltage); // 换向操作(根据转子的位置)
void InitADC10(void); // 初始化 ADC(用于速度指令)
void InitMCPWM(void); // 初始化 PWM为20kHz 中心对齐 互补对称模式,500 ns死区
void InitTMR1(void); // 初始化 TIMER1 (使用速度控制和电机停止保护)
void InitTMR3(void); // 初始化 TIMER3 (作为两个输入捕捉通道的时基)
void InitUserInt(void); // 初始化所有端口 (输入和输出) 
void Init_IC_and_CN(void); // 初始化输入捕捉和电平变换中断CN (用于霍尔传感器输入)
void RunMotor(void); // 初始化所有变量和中断(用于启动和运行电机) 
void StopMotor(void); // 清零所有标志位 停止和电机控制相关的操作,禁止PWM
void ForceCommutation(void); // 当电机低速运行,该函数强制换向
void ChargeBootstraps(void); // 在电机运行起始阶段 对bootstrap 电容进行充电
extern void SpeedControl(void); // 该函数包含所有汇编和C函数,进行速度PID环路控制
extern void SpeedCalculation(void);

// 工程里用到的标志位
struct 
{
unsigned MotorRunning :1;
unsigned MotorCommInAdv :1;
unsigned MotorAdvEnabled:1;
unsigned unused :13;
}Flags;
 
unsigned int HallValue; // 霍尔输入值
unsigned int Sector; // 当前扇区值
unsigned int LastSector; // 最后一个扇区的值,对于滤除因为硬件滤波导致的慢转换速率引起的错误信号
unsigned int MotorStalledCounter = 0; // 每 1 ms加1 每次检测到新扇区即清零.用于强制换向和电机零速保护

//  电机接线端子        | MCLV板连接
// -------------------------|-------------------
// 白(相)   

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     目录          0  2008-06-18 02:03  PID_Lab

     文件      21643  2007-06-01 14:27  PID_Lab\Close_Loop.c

     文件      44496  2007-06-01 14:27  PID_Lab\Close_Loop.o

     文件      41631  2006-03-24 14:54  PID_Lab\ClosedLoop.o

     文件       4338  2006-03-24 14:54  PID_Lab\foo.o

     文件      40709  2005-04-26 04:24  PID_Lab\p30f3010.gld

     文件      13364  2007-06-01 14:27  PID_Lab\PID.o

     文件       5003  2007-06-01 14:27  PID_Lab\PID.s

     文件      78767  2007-06-01 14:27  PID_Lab\PID_test.cof

     文件       9380  2007-06-01 14:27  PID_Lab\PID_test.hex

     文件      67641  2007-06-01 14:27  PID_Lab\PID_test.map

     文件        861  2007-05-21 21:02  PID_Lab\PID_test.mcp

     文件      95744  2008-06-18 02:26  PID_Lab\PID_test.mcw

     文件       7844  2007-06-01 14:27  PID_Lab\PID_test.mptags

     文件        103  2007-06-01 14:27  PID_Lab\PID_test.tagsrc

     文件        146  2008-06-18 02:23  PID_Lab\说明.txt

     文件       2651  2008-06-18 02:26  PID_Lab\PID_test.mcs

----------- ---------  ---------- -----  ----

               434321                    17


评论

共有 条评论