📄 dcmotor.c
字号:
#include "ICETEK-C6713-A.h"
unsigned int uWork,nCount,uN,nCount1,nDir;
main()
{
unsigned char dbScanCode;
char cKey,cOldKey;
uN=30; nCount=nCount1=0; nDir=0; cKey=cOldKey=0;
init_emif(); // 初始化emif
InitCTR(); // 初始化ICETEK-CTR
CTRGR=1; // DCME=1 打开直流电机, 见ICETEK-CTR的全局控制寄存器描述
// 设置FSR1管脚为通用输出管脚以输出pwm控制信号
SPCR1&=0x0fffffffe; // /RRST=0
PCR1|=0x2400; // RIOEN=1, FSRM=1
// 设置CLKX0管脚为通用输出管脚以控制电机转向
SPCR0&=0x0fffeffff; // /XRST=0
PCR0|=0x1200; // RIOEN=1, CLKXM=1
InitInterrupt(); // 设置中断向量表、Timer1的参数
while ( 1 )
{
if ( nCount>16 )
{
nCount=0;
dbScanCode=GetKey();
if ( dbScanCode!=0 && dbScanCode!=0x0ff )
{
if ( dbScanCode==SCANCODE_Enter ) break;
else
{
cKey=ConvertScanToChar(dbScanCode);
if ( cKey!=0 && cOldKey!=cKey )
{
cOldKey=cKey;
switch ( cKey )
{
case '0': uN=100; break;
case '1': uN=70; break;
case '2': uN=50; break;
case '3': uN=30; break;
case '4': uN=10; break;
case '5': uN=1; break;
case '+':
uN=60; // 降速
Delay(1024);
PCR0|=2;
nDir=0;
break;
case '-':
uN=60; // 降速
Delay(1024);
PCR0&=0x0fffffffd;
nDir=1;
break;
}
}
}
}
}
}
CSR&=0xfffffffe; // 关中断 GIE=0
TIMER1CTL&=0x0ffffff3f; // GO=0 /HLD=0 =>计数器暂停
CloseCTR();
exit(0);
}
void interrupt Timer() //中断响应函数
{
uWork=PCR1; // 根据占空比确定输出高或低电平
if ( nCount1>uN ) uWork|=4;
else uWork&=0x0fffb;
PCR1=uWork;
nCount++;
nCount1++; nCount1%=100;
}
void InitInterrupt(void)
{
// 设置中断控制寄存器
CSR&=0xfffffffe; // 关中断 GIE=0
ISTP=0x00000c00; // 重置中断向量表到0C00h
IMH=0x08000000; // 指定Timer1产生int15中断
IML=0;
ICR=0xff; // 清除等待的中断
IER=0x8003; // 使能int15中断
// 设置定时器产生中断信号的频率
TIMER1PRD=0x400; // 定时器1的周期
TIMER1CTL=0x3c0; // 开始计数
CSR=CSR|1; // 开中断
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -