用dsp2812的事件管理器中qep电路测量直流电机的转速,使用cpu定时器0读取转速的代码
时间: 2024-04-10 12:33:21 浏览: 100
在DSP2812中,事件管理器(Event Manager)可以用捕获和处理外,例如QEP电路的脉冲。以下是使用DSP2812的事件管理器测量直流电机转并使用CPU定时器0读取转速的示例代码:
```c
#include "DSP281x_Device.h"
// 定义 QEP 寄存器地址
#define QEP_BASE_ADDR 0x0000
// 定义 QEP 控制寄存器地址偏移量
#define QEP_QDECCTL_OFFSET 0x0002
#define QEP_QEPCTL_OFFSET 0x0003
// 定义 CPU 定时器寄存器地址
#define CPUTIMER0_BASE_ADDR 0x0000
// 定义 CPU 定时器寄存器地址偏移量
#define CPUTIMER0_TCR_OFFSET 0x0004
#define CPUTIMER0_TPR_OFFSET 0x0005
#define CPUTIMER0_TPRH_OFFSET 0x0006
// 定义直流电机转速的全局变量
volatile Uint16 motorSpeed = 0;
void main(void)
{
// 禁用中断
DINT;
// 初始化 QEP 控制寄存器
*(volatile Uint16*)(QEP_BASE_ADDR + QEP_QDECCTL_OFFSET) = 0x0000;
// 初始化 QEP 寄存器
*(volatile Uint16*)(QEP_BASE_ADDR + QEP_QEPCTL_OFFSET) = 0x0000;
// 初始化 CPU 定时器0寄存器
*(volatile Uint16*)(CPUTIMER0_BASE_ADDR + CPUTIMER0_TCR_OFFSET) = 0x0000;
*(volatile Uint16*)(CPUTIMER0_BASE_ADDR + CPUTIMER0_TPR_OFFSET) = 0x0000;
*(volatile Uint16*)(CPUTIMER0_BASE_ADDR + CPUTIMER0_TPRH_OFFSET) = 0x0000;
// 配置 CPU 定时器0为外部时钟模式,并启动定时器
CpuTimer0Regs.TCR.bit.TSS = 1; // 停止定时器
CpuTimer0Regs.TCR.bit.TRB = 1; // 复位定时器
CpuTimer0Regs.TCR.bit.TIE = 0; // 禁用中断
CpuTimer0Regs.TCR.bit.TSS = 0; // 启动定时器
// 配置事件管理器捕获 QEP 事件
EMURegs.EMIFALL = 0x0001; // 捕获 QEP 事件
EMURegs.EMIEVTCLR = 0x0001; // 清除事件标志
// 启用中断
EINT;
ERTM;
// 主循环
while (1)
{
// 等待事件发生
while ((EMURegs.EMIFLAG & 0x0001) == 0)
{
// 空闲等待
}
// 读取直流电机转速
motorSpeed = *(volatile Uint16*)(QEP_BASE_ADDR);
// 清除事件标志
EMURegs.EMIEVTCLR = 0x0001;
}
}
```
在上述代码中,我们首先禁用了中断,并初始化了QEP控制寄存器、QEP寄存器和CPU定时器0寄存器。然后配置CPU定时器0为外部时钟模式,并启动定时器。接下来,我们配置事件管理器以捕获QEP事件,并在主循环中等待事件发生。一旦事件发生,我们读取QEP寄存器获取直流电机的转速,并清除事件标志。
请注意,上述代码只是一个示例,实际使用时需要根据您的具体硬件配置和需求进行适当的修改。另外,您还需要根据DSP2812的数据手册来确定QEP和CPU定时器的寄存器地址和偏移量,并进行相应的配置。
希望能对您有所帮助!如有任何问题,请随时提问。
阅读全文