?? 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;
/*================================================
//當前狀態(tài)
#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;//啟動、停止調(diào)整參數(shù)
extern unsigned int nKeyIncrease;//增加
extern unsigned int nKeyDecrease;//減少
extern unsigned int nKeyStop; //急停
extern float fADAdjust; //旋鈕參數(shù),歸一到0-30V
extern float fADCInVoltage; //反饋電壓,歸一到0-30V
extern float fSetVelocity;
extern Uint flagKeyDelay;
// Display(STR2,0x82); // 上面一行顯示一個預定字符串
//第一行顯示當前狀態(tài)
Uchar StrState[]="狀態(tài) ";
Uchar StrStateConfig[]="參數(shù)調(diào)節(jié)";
Uchar StrStateRun[]="自動運行";
Uchar StrStateMan[]="手動運行";
//第二行顯示當前速度或者參數(shù)、方向
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];
//僅僅保留小數(shù)點后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();
/*====================================================================================
/* 參數(shù)初始化
/*====================================================================================*/
CurrentState=1;
fSetVelocity=5.0; //預設的速度
/*====================================================================================
/* 啟動部分功能
/*====================================================================================*/
asm(" clrc INTM");
START_ADC;
START_TIM;
// START_PWM;
// delayDecis(20);
/*====================================================================================
顯示歡迎信息,同時測試顯示屏
/*====================================================================================*/
while(1)
{
char *str;
/*====================================================================================
/* 判斷當前狀態(tài)
//當前狀態(tài)
#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;
//多余狀態(tài)轉(zhuǎn)移
if((CurrentState>nMaxState)||(CurrentState==0))
{
CurrentState=1;
}
/*====================================================================================
進入各個狀態(tài)的工作
/*====================================================================================*/
/*====================================================================================
參數(shù)調(diào)整
/*====================================================================================*/
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);
}
/* //根據(jù)與設定給出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 作為運轉(zhuǎn)時能,連接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 + -