📄 main.c
字号:
/**
Title: main_C
Author: DAI(戴红军)
Date: 2008.04.8
步进电机控制程序,for YAO
*/
#include "LF2407REGS.h"
#include "SysFun.h"
#include "lcm.h"
//#include <stdio.h>
//#include <stdlib.h>
#include "IoDef.h"
Uint CurrentState;
/*================================================
//当前状态
#define CONFIG 1 //KeyRunPause=0,PAUSE
#define AUTO 2 //KeyRunPause=1, KeyAutoMan=1;
#define MANUAL 3 //KeyRunPause=1, KeyAutoMan=0;
#define nMaxState 3
================================================*/
Uint CLOCKWISE=0;
Uint Motor=0;
Uint ENA=0;
Uint ENAold=0;
Uint DIR=0;
Uint nPWMPER=0;
Uint nFree=1;
extern unsigned int nIntervalTime;//保存当前间隔时间;
extern unsigned int nKeyAutoMan;//自动、手动
extern unsigned int nKeyRunPause;//启动、停止调整参数
extern unsigned int nKeyIncrease;//增加
extern unsigned int nKeyDecrease;//减少
extern unsigned int nKeyStop; //急停
extern float fADAdjust; //旋钮参数,归一到0-30V
extern float fADCInVoltage; //反馈电压,归一到0-30V
extern float fSetVelocity;
extern Uint flagKeyDelay;
// Display(STR2,0x82); // 上面一行显示一个预定字符串
//第一行显示当前状态
Uchar StrState[]="状态 ";
Uchar StrStateConfig[]="参数调节";
Uchar StrStateRun[]="自动运行";
Uchar StrStateMan[]="手动运行";
//第二行显示当前速度或者参数、方向
Uchar StrVelocity[] = "速度 ";
Uchar StrSetVelocity[] = "预设速度 ";
Uchar StrDir[]="方向 ";
Uchar StrLeft[]="左";
Uchar StrRight[]="右";
Uchar StrStop[]="停";
Uchar StrFree[]="空";
//第三行显示预设电压
Uchar StrSetVoltage[] = "预设电压";
//第四行显示反馈电压
Uchar StrFeedbackVoltage[] = "反馈电压";
Uchar StrScreen[64];
char StrFloatVelocity[8]; //**.*
char StrFloatFeedbackVoltage[8];
char StrFloatSetVoltage[8];
char Str[8];
//仅仅保留小数点后1位
void floatToString(float f, char * ch)
{
int n,deci,ones;
n= (int)f;
n=n%100;
deci=(n/10);
if(deci==0)
*ch=(0x20);
else
*ch=(n/10+0x30);
ch++;
*(ch++)=(n%10+0x30);
*(ch++)='.';
*(ch++)=((int)((f-(int)f)*10)+0x30);
*(ch++)='\0'; //end
}
/*
ascII code
a 61
z 7A
A 41
Z 5A
0 30
=========================================*/
main()
{
// char char1='1';
// floatToString(123.456,(char*)Str);
/*====================================================================================
/* 功能模块初始化
/*====================================================================================*/
SysInitial();
// DelayMs(10);
KeyInitial();
MotorInitial();
Timer2Initial();
AdcInitial();
LcmInitial();
/*====================================================================================
/* 参数初始化
/*====================================================================================*/
CurrentState=1;
fSetVelocity=5.0; //预设的速度
/*====================================================================================
/* 启动部分功能
/*====================================================================================*/
asm(" clrc INTM");
START_ADC;
START_TIM;
// START_PWM;
// delayDecis(20);
/*====================================================================================
显示欢迎信息,同时测试显示屏
/*====================================================================================*/
while(1)
{
char *str;
/*====================================================================================
/* 判断当前状态
//当前状态
#define CONFIG 1 KeyRunPause=0,PAUSE
#define AUTO 2 KeyRunPause=1, KeyAutoMan=1;
#define MANUAL 3 KeyRunPause=1, KeyAutoMan=0;
/*====================================================================================*/
if(nKeyRunPause==0)
CurrentState=CONFIG;
else if(nKeyRunPause==1&&nKeyAutoMan==1)
CurrentState=AUTO;
else if(nKeyRunPause==1&&nKeyAutoMan==0)
CurrentState=MANUAL;
//多余状态转移
if((CurrentState>nMaxState)||(CurrentState==0))
{
CurrentState=1;
}
/*====================================================================================
进入各个状态的工作
/*====================================================================================*/
/*====================================================================================
参数调整
/*====================================================================================*/
if(CurrentState == CONFIG)
{
ENA=0;
if(nKeyIncrease&&(flagKeyDelay==0))
{
fSetVelocity+=0.1;
if(fSetVelocity>10)
fSetVelocity=10.0;
flagKeyDelay=1;
}
if(KeyDecrease&&(flagKeyDelay==0))
{
fSetVelocity-=0.1;
if(fSetVelocity<0)
fSetVelocity=0.0;
flagKeyDelay=1;
}
// LcmClear();
DelayMs(10);
// LcmInitial();
Display(StrState, 0x80);
Display(StrStateConfig, 0x84); //1行80-87h
Display(StrSetVelocity,0x90); // 2行90-97h
Display(StrSetVoltage,0x88);// 3行 88-8F
Display(StrFeedbackVoltage,0x98);//4行98-9f
// sprintf(StrFloatVelocity, "%8.1f",fSetVelocity);
floatToString(fSetVelocity, Str);
Display((Uchar*)Str , 0x96); // 2 //hang
// sprintf(StrFloatSetVoltage, "%8.1f",fADAdjust);
floatToString(fADAdjust,Str);
Display((Uchar*)Str,0x8E); // 3 //hang
// sprintf(StrFloatFeedbackVoltage, "%8.1f",fADCInVoltage);
floatToString(fADCInVoltage,Str);
Display((Uchar*)Str,0x9E); //4hang
}
/*====================================================================================
自动运行
/*====================================================================================*/
if(CurrentState == AUTO)
{
//自动运行
ENA=1;
if(fADAdjust>fADCInVoltage)//电压低,电机向上移动;
DIR=0;
else
DIR=1;
// LcmClear();
DelayMs(10);
// LcmInitial();
Display(StrState, 0x80);
Display(StrStateRun, 0x84); //1行80-87h
Display(StrVelocity,0x90); // 2行90-97h
Display(StrDir,0x94); // 2行90-97h
Display(StrSetVoltage,0x88);// 3行 88-8F
Display(StrFeedbackVoltage,0x98);//4行98-9f
// sprintf(StrFloatVelocity, "%4.1f",fSetVelocity); //显示速度
floatToString(fSetVelocity, StrFloatVelocity);
Display((Uchar*)StrFloatVelocity,0x92);
// sprintf(StrFloatSetVoltage, "%8.1f",fADAdjust);
floatToString(fADAdjust, StrFloatSetVoltage);
Display((Uchar*)StrFloatSetVoltage,0x8E);
// sprintf(StrFloatFeedbackVoltage, "%8.1f",fADCInVoltage);
floatToString(fADCInVoltage, StrFloatFeedbackVoltage);
Display((Uchar*)StrFloatFeedbackVoltage,0x9E);
//方向
if(CLOCKWISE==0)
{
if(DIR==0)
Display((Uchar*)StrLeft, 0x97);
if(DIR==1)
Display((Uchar*)StrRight, 0x97);
}
else if(CLOCKWISE==1)
{ if(DIR==0)
Display((Uchar*)StrRight, 0x97);
if(DIR==1)
Display((Uchar*)StrLeft, 0x97);
}
}
/*====================================================================================
手动运行
/*====================================================================================*/
if(CurrentState == MANUAL)
{
if(nKeyIncrease||nKeyDecrease)
{
ENA=1;
}
else
ENA=0;
if(nKeyIncrease==1)
{
if(CLOCKWISE==0)
DIR=0;
else
DIR=1;
}
if(nKeyDecrease==1)
{
if(CLOCKWISE==0)
DIR=1;
else
DIR=0;
}
nFree=nKeyStop;
// LcmClear();
DelayMs(10);
// LcmInitial();
Display(StrState, 0x80);
Display(StrStateMan, 0x84); //1行80-87h
Display(StrVelocity,0x90); // 2行90-97h
Display(StrDir,0x94); // 2行90-97h
Display(StrSetVoltage,0x88);// 3行 88-8F
Display(StrFeedbackVoltage,0x98);//4行98-9f
// sprintf(StrFloatVelocity, "%4.1f",fSetVelocity); //显示速度
floatToString(fSetVelocity, StrFloatVelocity);
Display((Uchar*)StrFloatVelocity,0x92);
//方向
if(ENA==1)
{
if(DIR==0)
Display((Uchar*)StrLeft, 0x97);
if(DIR==1)
Display((Uchar*)StrRight, 0x97);
}
else if(nFree==1)
{
Display((Uchar*)StrStop, 0x97);
}
else
{
Display((Uchar*)StrFree, 0x97);
}
// sprintf(StrFloatSetVoltage, "%8.1f",fADAdjust);
floatToString(fADAdjust, StrFloatSetVoltage);
Display((Uchar*)StrFloatSetVoltage,0x8E);
// sprintf(StrFloatFeedbackVoltage, "%8.1f",fADCInVoltage);
floatToString(fADCInVoltage, StrFloatFeedbackVoltage);
Display((Uchar*)StrFloatFeedbackVoltage,0x9E);
}
/* //根据与设定给出PWM波的频率
ENA=0;
DIR=0;
ENA1=ENA;
DIR1=DIR;
ENA2=ENA;
DIR2=DIR;
ENA=1;
DIR=1;
ENA1=ENA;
DIR1=DIR;
ENA2=ENA;
DIR2=DIR;
*/
/*=================================================
3脚 PWM1作为方向,2脚 DIR1输出PWM, 4脚ENA2 作为运转时能,连接FREE引脚
==================================================*/
//PWM10/IOPE4 CMPR5 2 7407:11->10
PWM1=DIR; //IOPA6/ 3 7407:5->6
ENA2=nFree; //IOPE7/ 4 7407:3->4
nPWMPER = (Uint)(10*0x666/(fSetVelocity)); //10对应400HZ
*T3PER = nPWMPER;
*CMPR5= (nPWMPER/2); //IOPE4/PEM10
if(ENA!=ENAold)
{
if(ENA)
{STARTT3_PWM;}
else{STOPT3_PWM;}
ENAold=ENA;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -