📄 main.c
字号:
#include "global.c"
void Delay()
{
unsigned int i;
for(i=0;i<30000;i++);
for(i=0;i<30000;i++);
for(i=0;i<30000;i++);
for(i=0;i<30000;i++);
for(i=0;i<30000;i++);
for(i=0;i<30000;i++);
}
void CANInit()
{
MCRB|=0x00C0; /*IOPC6,IOPC7配置为特殊功能*/
CANIFR = 0xFFFF; /* 清除全部CAN中断标志 */
CANLAM0H = 0x9FFF; /* 使用LAM0 */
CANLAM0L = 0xFFFF; /* 接收任何信息 */
CANMCR = 0x1000; /* 配置寄存器改变请求 */
while((CANGSR & 0x0010)!=0x0010); /* CCE=1? */
CANBCR2 = 0x0003; /* 设置数据传输率:250Kbps */
CANBCR1 = 0x0061;
CANMCR = 0x0000; /* CPU正常工作请求 */
while((CANGSR & 0x0010)!=0x0000); /* CCE=0? */
CANMDER = 0x0000; /* 禁止缓冲 */
CANMCR = 0x0100; /* 数据场改变请求 */
CANID0H = 0xC000; /* 扩张帧,标识符屏蔽使能 */
CANID0L = 0x0000; /* ID, 29位 */
CANCTRL0 = 0x0008; /* 数据帧,8个字节 */
CANMCR = 0x0480; /* 正常工作请求 */
CANMDER = 0x0021; /* MessageBox0和MessageBox5使能 */
CANIMR = 0x2100; /* 禁止发送中断,高级使能,打开MessageBox0接收中断,5 */
CANIFR = 0xFFFF; /* 清除全部CAN中断标志 */
}
void ADCStart8()
{
ADCTRL1=0x4000; /* ADC模块复位 */
asm(" NOP ");
ADCTRL1=0x0000; /* 启动/停止模式,双排序器工作模式 */
MAXCONV=0x0000; /* 最大转换通道1路 */
CHSELSEQ3=0x0008; /* 转换顺序,0-1-2-3 */
asm(" NOP ");
asm(" NOP ");
ADCTRL2=0x0040;
ADCTRL2=0x0020; /* 启动ADC转换 */
while((ADCTRL2&0x0010)==0x0010); /* 等待转换完成 */
asm(" NOP ");
asm(" NOP ");
ADTEMP1=RESULT8;
ADTEMP1=ADTEMP1/256;
}
void EVAInit()
{
EVAIMRA = 0x0080; /* 定时器1周期中断使能 */
EVAIFRA = 0xFFFF; /* 清除中断标志 */
GPTCONA = 0x0000;
T1PR = 0xC350; /* 定时器1的初值,定时50ms */
T1CNT = 0x0000; /* 定时器的计数初值 */
T1CON = 0x144C; /* 连续增计数模式 16M/16=1M*/
}
void KickDog() /*踢除看门狗 */
{
WDKEY = 0x5555;
WDKEY = 0xAAAA;
}
void DSPInit()
{
asm(" SETC INTM "); /* 关闭总中断 */
asm(" CLRC SXM "); /* 禁止符号位扩展 */
asm(" CLRC CNF "); /* B0块映射为 on-chip DARAM*/
asm(" CLRC OVM "); /* 累加器结果正常溢出*/
SCSR1 = 0x06D4; /* 打开ADC,EVA,CAN和SCI的时钟,系统时钟CLKOUT=16M */
WDCR = 0x006F; /* 禁止看门狗,看门狗时钟64分频 */
KickDog(); /* 剔出看门狗 */
IFR = 0xFFFF; /* 清除中断标志 */
IMR = 0x0003; /* 打开中断1,2 */
/************************************************/
CANInit(); /* CAN初始化 */
EVAInit(); /* 定时器初始化*/
/************************************************/
NLED = 0; /* LED频率设初值 */
NMOTOR = 0; /* 电机计数设初值 */
}
void CANSend_MOTOR()
{
CANMDER = 0x0000; /* 禁止缓冲 */
CANMCR = 0x0100; /* 数据场改变请求 */
CANID5H = 0xd798; //1798839f //d79883a0 //02F041D0 //bcc41d00 //c2f31074
CANID5L = 0x839f;
CANCTRL5 = 0x0008; /* 数据帧,发送8个字节 */
CANBX5A = MOTOR1A;
CANBX5B = MOTOR1B;
CANBX5C = MOTOR1C;
CANBX5D = MOTOR1D;
CANMCR = 0x0480; /* CPU正常工作请求 */
CANMDER = 0x0021; /* MessageBox5,0使能 */
CANTCR = 0x0080; /* MessageBox5发送请求*/
while((CANTCR & 0x8000)!=0x8000);
CANIFR = 0xFFFF;
CANTCR = 0x8000;
}
/*
void MOTOR_POS() /*电机正转*
{
MOTOR1A = (MOTOR<<8) + 0x0001;
MOTOR1B = ((MOTOR>>8) & 0x00FF) + 0x0100;
}
void MOTOR_NEG() /*电机反转*
{
MOTOR1A = (MOTOR<<8) + 0x0041;
MOTOR1B = ((MOTOR>>8)&0x00FF) + 0x4100;
}
void MOTOR_POS() /*电机正转*
{
MOTOR1B = MOTOR;
MOTOR1C = 0x0001;
}
void MOTOR_NEG() /*电机反转*
{
MOTOR1B = MOTOR;
MOTOR1C = 0x0021;
}
*/
main()
{
/*************************/
DSPInit();
Delay();
/****系统运行指示灯****************************************/
MCRC = MCRC&0x0000; /*IOPF3 程序运行指示 */
asm(" NOP ");
PFDATDIR = PFDATDIR|0x2000;
asm(" NOP ");
PFDATDIR = PFDATDIR&0xFFDF;
/****DEBUG区****************************************/
asm(" CLRC INTM "); /* 开系统总中断 */
while(1)
{
;
}
/****DEBUG区****************************************/
}
void c_int2()
{
if(PIVR!=0x27)
{
asm(" CLRC INTM ");
return;
}
/**************灯1S闪烁一次***********/
NLED++;
if(NLED>=20)
{
PFDATDIR=PFDATDIR^0x0020;
NLED = 0;
}
/**************************************/
/********添加程序*************/
/****************sign: 0-正转,1-反转,2-停止******************/
/*
if( ((PFDATDIR&0x00001)==0x0000) && ((PFDATDIR&0x00002)==0x0002) )
{
motorsign=1;
}
else if( ((PFDATDIR&0x00001)==0x0001) && ((PFDATDIR&0x00002)==0x0000) )
{
motorsign=2;
}
else
{
motorsign=3;
}
switch(motorsign)
{
case 1:
{
MOTOR1C = 0x0001;
}
break;
case 2:
{
MOTOR1C = 0x0021;
}
break;
case 3:
{
MOTOR1C = 0x0000;
}
break;
default: break;
}
/*if( (PEDATDIR&0x0010) == 0x0010 )
{
motorsign=1;
}
if( (PADATDIR&0x0008) == 0x0008 )
{
motorsign=2;
}
/*if( ((PEDATDIR&0x0010)==0x0000) && ((PFDATDIR&0x0008)==0x0000) )
{
motorsign=3;
}*/
/*if( (PEDATDIR&0x0010) == 0x0000 )
{
if( (PADATDIR&0x0008) == 0x0008 )
{
motorsign=1;
}
}
else motorsign=2;
switch(motorsign)
{
case 1:
{
MOTOR1C = 0x0001;
}
break;
case 2:
{
MOTOR1C = 0x0021;
}
break;
default: break;
}
*/
/*
ADCStart8(); // 采集车速信号
ADh_1=ADTEMP1;
ADCStart8(); //采集车速信号
ADh_2=ADTEMP1;
ADCStart8(); //采集车速信号
ADh_3=ADTEMP1;
ADCStart8(); //采集车速信号
ADh_4=ADTEMP1;
ADh_0=(ADh_1+ADh_2+ADh_3+ADh_4)/4;
if (ADh_0 < 120)
NMOTOR = 1;
else if (ADh_0 >= 120 && ADh_0 < 160)
NMOTOR = 2;
else if (ADh_0 >= 160 && ADh_0 < 180)
NMOTOR = 3;
else if (ADh_0 >= 180 && ADh_0 <= 200)
NMOTOR = 4;
else
NMOTOR = 5;
switch (NMOTOR)
{
case 1:
{
MOTOR1BB = 1700; //40
MOTOR1CC = 0x0001; //fan
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -