📄 main.c
字号:
/*Main.c*/
#include "global.c"
#include "math.h"
void SystemInit();
void enbleint();
void KickDog();
void AddSpeet1();//
void AddSpeet2();
void PWMT_Init();
void T4PWM_Init();
//void T2PWM_Init();
void QEPINT();
void IOPC3_G();
void IOPC3_D();
void IOPC1_Int();
void IOPC1_D();
void IOPC1_G();
void Closed_LoopT4(int cw,unsigned p); //cw=1为顺时
void IOPF3_P(); //用IO口作步进电机的脉冲输出.
void IOPF3_PG(); //IOPF3作输出高.
void IOPF3_PD(); //IOPF3作输出低.
void delay(unsigned int i);
void delay_nms(unsigned int i);
void delay_1ms(void);
unsigned int j;
volatile unsigned int pnum=200;
unsigned int base=30000;
int flag=0,temp=40,temp1;
//volatile unsigned int temp;
main()
{
int t;
SystemInit();
QEPINT();
//IOPC3_G(); //LED
PWMT_Init();
//AddSpeet1(); //加速
AddSpeet2();
//enbleint(); //开总INT
//T4PWM_Init();
//T3CON|=0x0040; //开T3
//----------------用IO输出脉冲驱动电机测试(原来的T4PWM)---------
IOPC1_Int();
IOPC1_D(); //方向
IOPF3_P();
for(t=1;t<=100;t++)
{
Closed_LoopT4(1,100);
delay_nms(5);
Closed_LoopT4(2,100);
delay_nms(5);
}
//----------------用IO输出脉冲驱动电机测试(原来的T4PWM)---
while(1)
{
}
}
void SystemInit()
{
asm(" SETC INTM "); /* 关闭总中断 */
asm(" CLRC SXM "); /* 禁止符号位扩展 */
asm(" CLRC CNF "); /* B0块映射为 on-chip DARAM*/
asm(" CLRC OVM "); /* 累加器结果正常溢出*/
SCSR1=0x83FE; /* 系统时钟CLKOUT=20*2=40M */
/* 打开ADC,EVA,EVB,CAN和SCI的时钟,系统时钟CLKOUT=40M */
WDCR=0x006F; /* 禁止看门狗,看门狗时钟64分频 */
KickDog(); /* 初始化看门狗 */
IFR=0xFFFF; /* 清除中断标志 */
IMR=0x0000; // 禁止中断2*/
WSGR=0x00; // 禁止所有的等待状态
}
//利用比较单元产生PWM(T1,T3)
void PWMT_Init()
{
//**************************
// IFR=0x0FFFF;
// IMR = 0x02; //开INT2
// EVBIFRA = EVBIFRA|0x0002; //清除比较单元4中断标志
// EVBIMRA = EVBIMRA|0x0002; //比较单元4使能
//**************************
MCRC=MCRC|0x000A; //PE1,PE3为PWM口
ACTRB=0x0032; //逆转(对电机而言)
// ACTRB=0x0002; //顺转(对电机而言)
DBTCONB=0x0; //不使能死区控制
//T3PR=2000; //定时器1周期值,定时0.4us*2500=1ms
//CMPR4=1000; //比较值
CMPR5=0x0D350; //比较值>T1PR PWM9为强制高或 强制底
COMCONB=0x8200; //比较控制寄存器,使能比较操作
T3CNT=0x0;
T3CON=0x1440; //增模式, TPS系数40M/16=2.5M,
//**************************
MCRA=MCRA|0x0098; //PWM2,QEP1,QEP2
ACTRA=0x0C04; //逆转(转向已取消)
// ACTRA=0x0004; //顺转 (转向已取消)
DBTCONA=0x0; // 不使能死区控制
//T1PR=2000; //定时器1周期值,定时0.4us*2500=1ms
//CMPR1=1000; //比较值
//CMPR3=0xD350; //比较值>T1PR PWM9为强制高或 强制底
COMCONA=0x8200; //比较控制寄存器
T1CNT=0x0;
T1CON=0x1440; //增模式, TPS系数40M/16=2.5M,
//---------------------
MCRB=MCRB&0x0FFCF; //利用IOPC4口做方向信号
PCDATDIR=PCDATDIR|0x3000;
//PCDATDIR|=0x0030; //gao顺
PCDATDIR&=PCDATDIR&0xFFCF; //di逆
//************************
}
void AddSpeet1()
{
for( j=1200;j>=60;j--)
{
T1PR=40*j;
CMPR1=20*j;
T3PR=40*j;
CMPR4=20*j;
delay(100);
}
}
void AddSpeet2()
{
T1PR=10000; //定时器1周期值,定时0.4us*2500=1ms
CMPR1=5000; //比较值
//-----------------
T3PR=10000; //定时器3周期值,定时0.4us*2500=1ms
CMPR4=5000; //比较值
}
//-------------IOPC1初始化及设置例子----------------------------//
void IOPC1_Int()
{
MCRB&=0x0FFFD; //IOPC1 为输出IO
PCDATDIR|=0x0200;
}
void IOPC1_G()
{
PCDATDIR|=0x0002; //IOPC1致高
}
void IOPC1_D()
{
PCDATDIR&=0xFFFD; //IOPC1致底
}
//-------------IOPC1初始化及设置例子----------------------------//
//编码器初始化
void QEPINT()
{
T2PR=0X0FFFF; // 通用定时器2的周期寄存器为0XFFFF
T2CON=0X1870; // 通用定时器2为定向增减计数模式, 并且以正交编码脉冲电路作为时钟源
T2CNT=30000; // 即<3000为反转,>3000为正转
// WSGR=0x0000; // 不使能所有的等待状态
CAPCONA=0XE000; // 使能EVB的QEP电路
}
void enbleint()
{
asm(" CLRC INTM ");
}
//利用定时器4比较中断产生PWM(T4)
void T4PWM_Init()
{
//IFR=0x0FFFF;
//IMR = 0x04; //开INT3
EVBIFRB = EVBIFRB|0x0002; //清除比较单元4中断标志
EVBIMRB = EVBIMRB|0x0002; //定时器4比较单元使能
MCRC=MCRC|0x0800; //选T4PWM
GPTCONB=0x0044;
T4PR=10000; //定时器2周期值,定时0.4us*2500=1ms
T4CMPR=5000;
T4CNT=0x0;
T4CON=0x144A;
}
void IOPF3_P() //用IO口作步进电机的脉冲输出.
{
MCRC&=0xF7FF; //IOPF3为IO口.
PFDATDIR|=0x0808; //IOPF3作输出.
}
void IOPF3_PG() //IOPF3作输出高.
{
PFDATDIR|=0x0008;
}
void IOPF3_PD()
{
PFDATDIR&=0xFFF7; //IOPF3作输出低.
}
void Closed_LoopT4(int cw,unsigned p) //cw=1为顺时
{
if(cw==1)
{
IOPC1_D(); //顺时钟
while(abs(T2CNT-base)<p*5)
{
IOPF3_PG();
delay(114); //456=1ms
IOPF3_PD();
delay(114);
}
T2CNT=30000;
}
if(cw==2)
{
IOPC1_G(); //逆时钟
while(abs(T2CNT-base)<p*5)
{
IOPF3_PG();
delay(114); //456=1ms
IOPF3_PD();
delay(114);
}
T2CNT=30000;
}
}
void IOPC3_G()//LED
{
MCRB=MCRB&0xFFF7; //PC3=IO
PCDATDIR|=0x0808; //高
}
void IOPC3_D()//LED
{
MCRB=MCRB&0xFFF7; //PC3=IO
PCDATDIR|=0x0800; //底
}
void interrupt PHANTOM()
{
return; // 中断直接返回
}
void KickDog()
/*踢除看门狗 */
{
WDKEY=0x5555;
WDKEY=0xAAAA;
}
//为全比较单元中断程序(用T3)
void interrupt c_int2()
{
int flag; // 定义一个局部变量
flag=EVBIFRA&0x0002;
if(flag!=0x0002)
{
asm(" CLRC INTM "); // 允许总中断
return; // 如果不是定时器1周期中断,则直接返回
}
temp--;
if(temp==0)
{
T3CON&=0xFFBF;
temp=40;
asm(" SETC INTM ");
return;
}
/* temp = T2CNT/4;
if(temp>=8500&&temp<=8525||temp>=6500&&temp<=6525)
{
T3CON&=0xFFBF;
T1CON&=0xFFBF;
}*/
//T3CNT=0;
EVBIFRA|=0x02;
asm(" CLRC INTM ");
return;
}
/*---------------------------------------延时函数-------------*/
void delay(unsigned int i) //第一次6US,以后就是2US一次
{
unsigned int j;
for(j=1;j<i;j++)
{ asm(" nop"); }
}
void delay_nms(unsigned int i) //每一次1MS
{
unsigned int j;
for(j=1;j<=i;j++)
{ delay(456); }
}
void delay_1ms(void)
{
delay_nms(1);
}
/*---------------------------------------延时函数-------------*/
/*//利用定时器比较单元产生PWM(T4)
void T4PWM_Init()
{
MCRC=MCRC|0x0800;
GPTCONB=0x0044;
T4PR=1500; //定时器2周期值,定时0.4us*2500=1ms
T4CMPR=750;
T4CNT=0x0;
T4CON=0x144A;
}*/
/*void T2PWM_Init()//T2已用于QEP
{
// IFR=0x0FF;
// IMR = 0x04;
// EVAIFRB = EVAIFRB|0x0001;
// EVAIMRB =EVAIMRB|0x0001;
MCRA=MCRA|0x2000;
GPTCONA=0x0048;
T2PR=4000; //定时器2周期值,定时0.4us*2500=1ms
T2CMPR=2000;
T2CNT=0x0;
T2CON=0x144A;
}*/
//定时器4比较中断
/*void interrupt c_int3()
{
if(PIVR!=0x3A)
{ asm(" CLRC INTM ");
return;
}
numled--;
if(numled==0)
{
numled=500;
if((PCDATDIR&0x0004)==0x0004)
PCDATDIR&=0xFFFB; //IOPC2致底
else
PCDATDIR|=0x0004; //IOPC2致高
// T3CON&=0xFFBF;
// T1CON&=0xFFBF;
}
//T3CNT=0;
EVBIFRB|=0x02;
asm(" CLRC INTM ");
return;
}
*/
//定时器4比较中断
/*void interrupt c_int3()
{
// int temp;
if(PIVR!=0x3A)
{
asm(" CLRC INTM ");
return;
}
/* temp = T2CNT/4;
// if(temp>=8500&&temp<=8525||temp>=6500&&temp<=6525)
if(temp==6500) //基准点为7500--- 逆减 顺大
{
T3CON&=0xFFBF;
T1CON&=0xFFBF;
T4CON&=0xFFBF;
}
// temp = T2CNT;
//qeudata=qeudata-20;
// if(temp==qeudata-20)
// {
// pnum--;
// if( pnum==0)
// flag=1;
// }
T4CNT=0;
EVBIFRB|=0x02;
asm(" CLRC INTM ");
return;
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -