📄 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 + -