Thread 中讨论的其他器件:SYSBIOS
我正在尝试使用捕获控制引脚来测量输入引脚的 PWM。 我仔细阅读、发现使用2个引脚最简单、但遗憾的是、我当前的应用中只有1个引脚。 我将使用 T0CCP0来使用计时器0A 中断。 代码如下所示:
用于创建 HWI 并切换内部时钟以使用 timer3的 application.cfg 设置
var Clock = xdc.useModule('ti.sysbios.knl.Clock');
Clock.timerId = 3; /* use timer 3 */
var ti_sysbios_family_arm_m3_Hwi3Params = new ti_sysbios_family_arm_m3_Hwi.Params();
ti_sysbios_family_arm_m3_Hwi3Params.instance.name = "motorSpeedIntHandle";
Program.global.motorSpeedIntHandle = ti_sysbios_family_arm_m3_Hwi.create(19, "&MotorSpeedIntHandler", ti_sysbios_family_arm_m3_Hwi3Params);
PWM_Measure.cc
extern "C" void MotorSpeedIntHandler() {
static uint32_t pwm_fall_edge = 0;
static uint32_t pwm_rise_edge = 0;
static uint32_t log_counter = 0;
// Timer has timed out
if (TimerIntStatus(TIMER0_BASE, TIMER_TIMA_TIMEOUT) == TIMER_TIMA_TIMEOUT) {
// If we timed out throw away sample
pwm_fall_edge = 0;
pwm_rise_edge = 0;
TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
}
if (TimerIntStatus(TIMER0_BASE, TIMER_TIMA_TIMEOUT) == TIMER_CAPA_EVENT) {
int32_t pin_value = GPIOPinRead(GPIO_PORTL_BASE, GPIO_PIN_4);
if (pin_value == 0) {
pwm_fall_edge = TimerValueGet(TIMER0_BASE, TIMER_A);
int32_t pwm_on_time = pwm_rise_edge - pwm_fall_edge;
motor_speed_measured_RPM = (pwm_on_time / MOTOR_PWM_FEEDBACK_SPEED_CONVERSION_INVERSE);
} else {
pwm_rise_edge = TimerValueGet(TIMER0_BASE, TIMER_A);
}
TimerIntClear(TIMER0_BASE, TIMER_CAPA_EVENT);
}
}
void motorControlFeedbackInit() {
// Signal is a 482Hz from 5% - 100% duty cycle
SysCtlPeripheralDisable(SYSCTL_PERIPH_TIMER0);
SysCtlPeripheralReset(SYSCTL_PERIPH_TIMER0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
// Initialize timer A and B to count up in edge time mode
TimerConfigure(TIMER0_BASE, (TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_CAP_TIME | TIMER_CFG_A_ACT_NONE));
// 120MHz / 4 = 30MHz
TimerPrescaleSet(TIMER0_BASE, TIMER_A, 4);
// Timer a records pos edge time and Timer b records neg edge time
TimerControlEvent(TIMER0_BASE, TIMER_A, TIMER_EVENT_BOTH_EDGES);
TimerLoadSet(TIMER0_BASE, TIMER_A, 0xFFFF);
//Configure the pin that the timer reads from (PL4)
GPIOPinConfigure(GPIO_PL4_T0CCP0);
GPIOPinTypeTimer(GPIO_PORTL_BASE, GPIO_PIN_4);
TimerIntRegister(TIMER0_BASE, TIMER_A, MotorSpeedIntHandler);
// Enable the indicated timer interrupt source.
TimerIntClear(TIMER0_BASE, (TIMER_CAPA_EVENT | TIMER_TIMA_TIMEOUT));
TimerIntEnable(TIMER0_BASE, (TIMER_CAPA_EVENT | TIMER_TIMA_TIMEOUT));
TimerEnable(TIMER0_BASE, TIMER_A);
}
我遇到的问题是、正如您在 init 函数中看到的那样、我需要手动注册一个中断 、因为在我注册这个中断(或取消注册任何已设置的中断)后、这个中断在.cfg 中都无法正常运行。 我怀疑这是因为 RTOS 使用 timer0、它在后台执行记录自身节拍中断的操作、不喜欢我尝试覆盖该中断的情况。 我是否在.cfg 中遗漏了某个内容?
谢谢!




