?? motor.c
字號:
/*************************************************************************/
/*************************************************************************/
#include "f2407.h"
void inline disable();
void inline enable();
void initial();
void pwm1(int);
void pwm7(int);
void interrupt nothing();
/*************************
主程序
**************************/
main()
{
disable( ); /*禁止總中斷*/
initial( ); /*系統初始化*/
T2CON=T2CON|0X0040; /*啟動定時器2*/
T4CON=T4CON|0X0040; /*啟動定時器4*/
enable( ); /*開總中斷*/
PBDATDIR=PBDATDIR&0xFFDF; /*IOPB5=0,允許電機9轉*/
pwm1(125); /*電機9正轉*/
PFDATDIR=PFDATDIR&0xFFF7; /*IOPF3=0,允許電機8*/
pwm7(50); /*電機8正轉*/
// PBDATDIR=PBDATDIR|0x0020; /*IOPB5=1,禁止電機9轉 */
// PFDATDIR=PFDATDIR|0x0008; /*IOPF3=1,禁止電機8轉 */
}
/************************************
系統初始化子程序
*************************************/
void initial()
{
//asm(" setc INTM"); /* 禁止所有中斷*/
asm(" setc SXM"); /* 符號位擴展有效*/
asm(" clrc OVM"); /* 累加器中結果正常溢出*/
asm(" clrc CNF"); /* B0被配置為數據存儲空間*/
SCSR1=0x02FD; /* CLKIN=10M,CLKOUT=2*CLKIN=20M*/
WDCR=0x0E8; /* 不使能看門狗,因為SCSR2中的WDOVERRIDE*/
/* 即WD保護位復位后的缺省值為1,故可以用*/
/* 軟件禁止看門狗*/
MCRA=0x00FF; /*A組引腳,配置通用IOPB0-IOPB7端口,PWM1/2,CAP1/CAP2*/
MCRB=0xFFFF; /*B組引腳配置為基本功能口*/
MCRC=0x03FF; /*C組引腳,配置PWM7/8端口,CAP4/CAP5*/
PBDATDIR=PBDATDIR|0xFFFF; /*端口為輸出,且輸出1*/
PFDATDIR=PFDATDIR|0xFFFF; /*端口為輸出,且輸出1*/
T1CON=0x0000; /*禁止定時器1*/
T2CON=0x0000; /*禁止定時器2*/
T3CON=0x0000; /*禁止定時器3*/
T4CON=0x0000; /*禁止定時器4*/
GPTCONA=0x0400; /*配置GPTCONA*/
GPTCONB=0x0000; /*配置GPTCONB*/
EVAIFRA=0XFFFF; /*清除中斷*/
EVAIFRB=0XFFFF; /*清除中斷*/
EVAIFRC=0XFFFF; /*清除中斷*/
EVBIFRA=0XFFFF; /*清除中斷*/
EVBIFRB=0XFFFF; /*清除中斷*/
EVBIFRC=0XFFFF; /*清除中斷*/
EVAIMRA=0X0000; /*禁止中斷*/
EVAIMRB=0X0000; /*禁止中斷*/
EVAIMRC=0X0000; /*禁止中斷*/
EVBIMRA=0X0000; /*禁止中斷*/
EVBIMRB=0X0000; /*禁止中斷*/
EVBIMRC=0X0000; /*禁止中斷*/
IFR=0xFFFF; /*清除全部中斷標志,"寫1清0"*/
IMR=0x0000; /*允許INT1,INT4中斷0009*/
}
/************************************
PWM輸出初始化,產生周期20KHZ的PWM脈沖
*************************************/
void pwm1(int pwm_duty1)
{
/*定時器1配置在PWM1-6引腳處,為PWM提供時鐘*/
T1CNT=0x0000; /*清除定時器計數器*/
T1PR=500; /*設置定時器周期*/
DBTCONA=0x0000; /*死區單元關閉*/
CMPR1=pwm_duty1; /*設置PWM1占空比為(T1PR-pwm_duty1)/T1PR */
ACTRA=0x0666; /*PWM1/3/5引腳設置高電平有效,PWM2/4/6為低有效*/
COMCONA=0x8200; /*配置COMCONA寄存器*/
T1CON=0x0840; /*配置T1CON寄存器*/
}
void pwm7(pwm_duty7)
{
/*定時器3配置在PWM7-12引腳處,為PWM提供時鐘*/
T3CNT=0x0000; /*清除定時器計數器*/
T3PR=500; /*設置定時器周期*/
DBTCONB=0x0000; /*死區單元關閉*/
CMPR4=pwm_duty7; /*設置PWM7占空比為2*(T3PR-pwm_duty7)/T3PR */
ACTRB=0x0666; /*PWM7/9/11引腳設置高電平有效,PWM8/10/12為低有效*/
COMCONB=0x8200; /*配置COMCONB寄存器*/
T3CON=0x0840; /*配置T3CON寄存器*/
}
/****************************
屏蔽中斷子程序
****************************/
void inline disable()
{
asm(" setc INTM");
}
/****************************
開總中斷子程序
*****************************/
void inline enable()
{
asm(" clrc INTM");
}
/************************************
若是由于干擾引起其它中斷,則執行此子程序
************************************/
void interrupt nothing()
{
asm(" clrc INTM"); /*返回前開中斷*/
return;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -