Other Parts Discussed in Thread: SYSCONFIG
Hello all,
I tried to modify the example "timx_timer_mode_capture_duty_and_period" from the "mspm0_sdk_1_00_01_03". I changed the Pin for the timer to PIN 1, the Timer from TIMG0 to TIMA0 and the Timer Clock Divider from 1 to 8. So the Clock frequency is 15.63 kHz.
The signal applied to pin 1 looks like this:
The signal is periodic, period time approx. 2.36ms. The voltage ranges between 0V and 3.3V.
My code looks like this:
/**
* main.c
*/
#include "ti_msp_dl_config.h"
#define TIMER_CAPTURE_PERIOD (2000)
volatile bool gCheckDutyAndPeriod;
int main(void)
{
volatile static uint32_t pwmPeriod;
__attribute__((unused)) volatile static uint32_t pwmDuty;
bool isSyncDone = false;
SYSCFG_DL_init();
NVIC_EnableIRQ(CAPTURE_0_INST_INT_IRQN);
DL_TimerG_startCounter(CAPTURE_0_INST);
DL_TimerG_startCounter(PWM_0_INST);
while (1) {
gCheckDutyAndPeriod = false;
while (false == gCheckDutyAndPeriod) {
__WFE();
}
/*
* In Capture Combined Mode the timer is counter is reloaded every time
* a rising edge is detected and capture compare register 0 loads the
* counter value when the another rising edge is detected.
* Therefore the period of the pwm signal will be the reload value
* minus the capture compare register value.
*/
pwmPeriod =
TIMER_CAPTURE_PERIOD - (DL_Timer_getCaptureCompareValue(
CAPTURE_0_INST, DL_TIMER_CC_1_INDEX));
/*
* In Capture Combined Mode the number of timer clocks that the signal
* remained high is captured in capture compare register 1.
* In order to determine timer clocks between a rising edge and
* the next falling edge. It is necessary to subtract the timer
* reload value minus capture compare register 1 value.
* t_high = TIMER_CAPTURE_PERIOD - TIMER_X_CC01[1]
* To calculate the duty cycle use the following formula:
* pwmDuty = (t_high / pwmPeriod) * 100
*/
pwmDuty = ((TIMER_CAPTURE_PERIOD -
DL_Timer_getCaptureCompareValue(
CAPTURE_0_INST, DL_TIMER_CC_0_INDEX)) *
100) /
pwmPeriod;
if (isSyncDone) {
/*
* Set a breakpoint to inspect pwmPeriod and pwmDuty results */
//__BKPT(0);
} else {
/*
* More than one clock period must be captured to ensure that the
* timers are synchronized.
*/
isSyncDone = true;
}
}
}
void CAPTURE_0_INST_IRQHandler(void)
{
switch (DL_TimerG_getPendingInterrupt(CAPTURE_0_INST)) {
case DL_TIMERG_IIDX_CC0_DN:
gCheckDutyAndPeriod = true;
break;
default:
break;
}
}
The .sysconfig -File for the Timer looks like this:
CAPTURE1.$name = "CAPTURE_0";
CAPTURE1.captMode = "COMBINED";
CAPTURE1.timerClkPrescale = 256;
CAPTURE1.interrupts = ["CC0_DN"];
CAPTURE1.timerPeriod = "16ms";
CAPTURE1.timerClkDiv = 8;
CAPTURE1.peripheral.$assign = "TIMA0";
CAPTURE1.peripheral.ccp0Pin.$assign = "PA0";
My problem is that the timer does not measure the period time correctly. The value I get for the variable "pwmPeriod" is always 1751(dec), no matter what frequency is applied to pin 1.
1751*(1/15630) = 11ms/period -> should be 2.36ms/period.
The value of register CC01 is always 0xF9.
The value of register CC00 is changing, depending on the high-time of the signal.
Does anyone know what I am doing wrong?

