📄 spwm.c
字号:
rxd_buffer[rxd_counter]=rxd;
rxd_counter++;
}
*/
PieCtrl.PIEACK.all|=PIEACK_GROUP9;
}
/*
void rxd_operate(void)
{
// uchar checkout;
if(rxd_counter!=rxd_NUM)return; //不满一帧数据退出
rxd_counter=0; //一帧数据已满,数据指针清零
// checkout=rxd_buffer[0]^rxd_buffer[1]^rxd_buffer[2]^rxd_buffer[3]; //计算校验数据
if(rxd_buffer[0]==0xeb&&rxd_buffer[rxd_NUM-1]==0x90) //判断数据是否正确
{
// txd_flag=0x55;
if(rxd_buffer[1]==0x55)fr=rxd_buffer[2]; //正转
if(rxd_buffer[1]==0xa5)fr=0; //停止
}
// else
// {
// error=0x55; //数据错误,置错误标志
// }
}
*/
/*********************************************************************************
**函数名称:Timer0
**功能描述:定时器0中断服务程序,0.02s中断一次
**输入参数:
**输出参数:
**全局变量:
**调用模块:
**说明:
**注意:
*********************************************************************************/
interrupt void Timer0(void)
{
//电机加速
if(f < fr)
{
speed_up++;
if(speed_up == speedup_times)
{
f++;
speed_up = 0;
}
}
//电机减速
if((f > fr) && (f > 1))
{
speed_down++;
if(speed_down == speeddown_times)
{
f--;
speed_down = 0;
}
}
AD_times++;
if(AD_times == 10)
{
AdcRegs.ADCTRL2.bit.SOC_SEQ1=1; //软件触发,启动SEQ1
AD_times = 0;
}
PieCtrl.PIEACK.all |= PIEACK_GROUP1; //写1清除中断响应标志位
}
/*********************************************************************************
**函数名称:Delay(unsigned int n)
**功能描述:延迟子程序
**输入参数:n,控制延迟时间参数
**输出参数:
**全局变量:
**调用模块:
**说明:
**注意:
*********************************************************************************/
void Delay(unsigned int n)
{
unsigned int m=n;
for(;m>0;m--);
}
/*****************************************************************************
**函数名称:Motor_operate()
**功能描述:2812从双口RAM中读取电机控制命令;
**输入参数:
**输出参数:
**全局变量:
**调用模块:
**说明:
**注意:
*****************************************************************************/
void Motor_operate()
{
unsigned int temp1,temp2,temp3;
//设置数据方向从双口RAM到DSP2812
read_RAM;
Delay(100);
//读取电机启动标志,如果电机没有启动,退出
temp1 = motor_run;
temp1 = motor_run & 0x00ff;
if(temp1 != 0x0055)
{
if(f <= 1)
{
motor_state = motor_stop;
//点亮目前电机状态指示灯,停止
GpioDataRegs.GPBDAT.bit.GPIOB1 = 0; //电机停止
GpioDataRegs.GPBDAT.bit.GPIOB0 = 1; //电机反转
GpioDataRegs.GPFDAT.bit.GPIOF0 = 1; //电机正转
}
fr = 1;
return;
}
//读取电机正反转命令
temp2 = motor_control ;
temp2 = motor_control & 0x00ff ;
//读取设定的频率
if(frequence_select == 0)
{
temp3 = frequence_enactment ;
temp3 = frequence_enactment & 0x00ff ;
GpioDataRegs.GPFDAT.bit.GPIOF8 = 0; //键盘给定
GpioDataRegs.GPFDAT.bit.GPIOF9 = 1; //模拟给定
}
else if(frequence_select == 1)
{
temp3 = (unsigned int)((ADCINA1_value / 2.5)*50);
if(temp3 >= 50)temp3 = 50;
GpioDataRegs.GPFDAT.bit.GPIOF8 = 1; //键盘给定
GpioDataRegs.GPFDAT.bit.GPIOF9 = 0; //模拟给定
}
switch(motor_state)
{
//1.电机停止时改变电机运行状态,可以直接改变电机状态
case motor_stop:
switch(temp2)
{
case 1: //电机正转
motor_state = motor_forward;
fr = temp3;
//点亮目前电机状态指示灯,正转
GpioDataRegs.GPBDAT.bit.GPIOB1 = 1; //电机停止
GpioDataRegs.GPBDAT.bit.GPIOB0 = 1; //电机反转
GpioDataRegs.GPFDAT.bit.GPIOF0 = 0; //电机正转
break;
case 2: //电机反转
motor_state = motor_backward;
fr = temp3;
//点亮目前电机状态指示灯,反转
GpioDataRegs.GPBDAT.bit.GPIOB1 = 1; //电机停止
GpioDataRegs.GPBDAT.bit.GPIOB0 = 0; //电机反转
GpioDataRegs.GPFDAT.bit.GPIOF0 = 1; //电机正转
break;
default:break;
}
break;
case motor_forward:
switch(temp2)
{
case 1: //电机正转
motor_state = motor_forward;
fr = temp3;
//点亮目前电机状态指示灯,正转
GpioDataRegs.GPBDAT.bit.GPIOB1 = 1; //电机停止
GpioDataRegs.GPBDAT.bit.GPIOB0 = 1; //电机反转
GpioDataRegs.GPFDAT.bit.GPIOF0 = 0; //电机正转
break;
case 2: //电机反转
motor_state = motor_forward;
motor_flag = 0x02;
//点亮目前电机状态指示灯,正转
GpioDataRegs.GPBDAT.bit.GPIOB1 = 1; //电机停止
GpioDataRegs.GPBDAT.bit.GPIOB0 = 1; //电机反转
GpioDataRegs.GPFDAT.bit.GPIOF0 = 0; //电机正转
fr = 1;
break;
default:break;
}
break;
case motor_backward:
switch(temp2)
{
case 1: //电机正转
motor_state = motor_backward;
motor_flag = 0x01;
fr = 1;
//点亮目前电机状态指示灯,反转
GpioDataRegs.GPBDAT.bit.GPIOB1 = 1; //电机停止
GpioDataRegs.GPBDAT.bit.GPIOB0 = 0; //电机反转
GpioDataRegs.GPFDAT.bit.GPIOF0 = 1; //电机正转
break;
case 2: //电机反转
motor_state = motor_backward;
fr = temp3;
//点亮目前电机状态指示灯,反转
GpioDataRegs.GPBDAT.bit.GPIOB1 = 1; //电机停止
GpioDataRegs.GPBDAT.bit.GPIOB0 = 0; //电机反转
GpioDataRegs.GPFDAT.bit.GPIOF0 = 1; //电机正转
break;
default:break;
}
break;
default:break;
}
//电机正转
if(motor_flag == 0x01 && f == 1)
{
motor_state = motor_forward;
fr = temp3;
motor_flag = 0x00;
//点亮目前电机状态指示灯,正转
GpioDataRegs.GPBDAT.bit.GPIOB1 = 1; //电机停止
GpioDataRegs.GPBDAT.bit.GPIOB0 = 1; //电机反转
GpioDataRegs.GPFDAT.bit.GPIOF0 = 0; //电机正转
}
//电机反转
if(motor_flag == 0x02 && f == 1)
{
motor_state = motor_backward;
fr = temp3;
motor_flag = 0x00;
//点亮目前电机状态指示灯,反转
GpioDataRegs.GPBDAT.bit.GPIOB1 = 1; //电机停止
GpioDataRegs.GPBDAT.bit.GPIOB0 = 0; //电机反转
GpioDataRegs.GPFDAT.bit.GPIOF0 = 1; //电机正转
}
}
/******************************************************************************
**函数名称:Data_display()
**功能描述:异步控制方式,载波比N随着输出频率的增大而减少,并且使载波比N是3的倍数,
保证三相输出的对称性
**输入参数:
**输出参数:
**全局变量:
**调用模块:
**说明:
**注意:
******************************************************************************/
void Data_display()
{
write_RAM;
Delay(100);
if(f <= 1)
{
motor_frequence_display = 0;
}
else
{
motor_frequence_display = f; //将实时频率写入双口RAM中
}
motor_state_display = motor_state;
BUS_voltage = ( unsigned int )( ( ADCINA0_value / 2.5 ) * 160 );
current_A = 0; //A相电流
current_B = 0; //B相电流
BUS_current = 0; //母线电流
}
/******************************************************************************
**函数名称:carrier_wave_ratio()
**功能描述:异步控制方式,载波比N随着输出频率的增大而减少,并且使载波比N是3的倍数,
保证三相输出的对称性
**输入参数:
**输出参数:
**全局变量:
**调用模块:
**说明:
**注意:
******************************************************************************/
void carrier_wave_ratio(void)
{
//异步控制方式,载波频率不变
// N = fc_max / f;
// N = ( N / 3 ) * 3;
// fc = f * N;
// Tpwm = 37500000 / fc;
N = fc / f;
Tpwm = 37500000 / fc;
EvaRegs.T1PR = Tpwm / 2;
EvaRegs.T1CON.bit.TENABLE = 1; //启动EVA定时器1
}
/*********************************************************************************
**函数名称:parameter_select()
**功能描述:设定电机的运行参数,只有在电机停机时,包括调制方式、频率给定方式、
加减速时间的设定
**输入参数:
**输出参数:
**全局变量:
**调用模块:
**说明:
**注意:
*********************************************************************************/
void parameter_select(void)
{
unsigned char temp;
if((motor_state != motor_stop) || (motor_flag != 0x00))return;
read_RAM; //设置数据方向从双口RAM到DSP2812
Delay(100);
//选择调制方式
temp = (unsigned char)(modulation & 0x00ff);
if(modulation_select != temp)
{
modulation_select = temp;
EvaRegs.T1CON.bit.TENABLE = 0; //停止EVA定时器1
EALLOW;
if(modulation_select == 0){PieVectTable.T1UFINT = &spwm;}
if(modulation_select == 1){PieVectTable.T1UFINT = &svpwm;}
EDIS;
EvaRegs.T1CON.bit.TENABLE = 1; //启动EVA定时器1
}
//选择频率给定方式
temp = (unsigned char)(f_select & 0x00ff);
frequence_select = temp;
//选择转矩提升曲线
temp = (unsigned char)(torque_lifting & 0x00ff);
if(temp == 1)m_sel = m1;
else if(temp == 2)m_sel = m2;
else m_sel = m3;
//加减速时间设置
temp = (unsigned char)(speedup_time & 0x00ff);
speedup_times = temp;
temp = (unsigned char)(speeddown_time & 0x00ff);
speeddown_times = temp;
}
interrupt void AD_convert(void)
{
ADCINA0_value=( (float)AdcRegs.RESULT0 ) * 3.0 / 65520.0;
ADCINA1_value=( (float)AdcRegs.RESULT1 ) * 3.0 / 65520.0;
ADCINB0_value=( (float)AdcRegs.RESULT2 ) * 3.0 / 65520.0;
ADCINB4_value=( (float)AdcRegs.RESULT3 ) * 3.0 / 65520.0;
AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR = 1; //清除SEQ1的中断标志INT_SEQ1
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; //排序器1复位
PieCtrl.PIEACK.all |= PIEACK_GROUP1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -