dsPIC30F2010 microchip 无刷直流电机
AN957
void _ISR _CNInterrupt(void){
IF = 0;// 清零标志HallValue = PORTB & 0x0038;// 屏蔽其它位,保留RB3、RB4和RB5HallValue = HallValue >> 3;// 执行3次右移
OVDCON = StateLoTable[HallValue];// 装载改写控制寄存器}
/*********************************************************************ADC中断用给定的电位计值装载DesiredSpeed变量。然后用该值来确定速度误差。当电机不运行时,使用来自电位计的直接给定值作为PDC值。
*********************************************************************/void _ISR _ADCInterrupt(void){
IFS0bits.ADIF = 0;
DesiredSpeed = ADCBUF0;if (!Flags.RunMotor)
{
PDC1 = ADCBUF0;// 赋值……PDC2 = PDC1;// 并装载所有的三个PWM……PDC3 = PDC1;// 占空比寄存器}
}
/************************************************************************该主程序控制初始化,按键以起动和停止电机。
************************************************************************/int main(void){
LATE = 0x0000;// 设置为输出PWM信号CNEN1 = 0x00E0;// 使能CN5、CN6和CN7// 使能内部上拉IF = 0;// 清零IE = 1;// 允许CN中断SpeedError = 0;SpeedIntegral = 0;InitTMR3();InitMCPWM();InitADC10();while(1){
while (!S2);// 等待按开始键while (S2)// 等待直到释放按键
DelayNmSec(10);
// 通过端口B读来自霍尔位置传感器的信号HallValue = PORTB & 0x0038;// 屏蔽其它位,保留RB3、RB4和RB5HallValue = HallValue >> 3;// 右移以获得值1、2……6OVDCON = StateLoTable[HallValue];// 装载改写控制寄存器PWMCON1 = 0x0777;// 使能PWM输出Flags.RunMotor = 1;// 将标志置1T3CON = 0x8030;// 启动TMR3while (Flags.RunMotor)// 当电机运行时
if (!S2)// 如果未按下S2
© 2005 Microchip Technology Inc.DS00957A_CN第13页