возможно ли его переписать , чтобы получить нужный ШИМ с периодом 20 мс и длительностью импульса 0,8-2,2 с шагом 0,01 мс ?
пока не понял что тут имеют в виду: (предполагаю, что описывают часы )
void MCB2300_PWMInit(int32 nCycleTime, int32 nErrIn, int32* pnErrOut) {
int32 m=0, n=0, pll=0, cclksel=0, cclk=0, pclk=0;
if (nErrIn) {
if (pnErrOut) {
*pnErrOut = nErrIn;
}
return;
}
PINSEL10 = 0;
m = PLLSTAT & 0x7FFF; // PLL multiplier (bits 14:0)
n = (PLLSTAT & 0xFF0000) >> 16; // PLL divider (bits 23:16)
pll = 2 * (m+1) * MainClock / (n+1); // MHz
cclksel = CCLKCFG & 0xFF; // pll divider to get clock
cclk = pll / (cclksel + 1); // clck in MHz
pclk = cclk/4;
PWM1PR = pclk; // pre scale register to get 1ms
PWM1MR0 = nCycleTime; // match register 0 gives cycle time
PWM1MCR = 2;
PWM1CTCR = 0; // PWM count control register - timer mode
PWM1TCR |= 0x9; // PWM timer control register - enable timer counter and prescale counter
PWM1LER |= 1;
gnCycleTime = nCycleTime;
if (pnErrOut) {
*pnErrOut = 0;
}
}
стал разбираться дальше:
nCycleTime - время цикла - период, скорее всего, пока не понял, в мс или Гц. в установка в для ШИМ задаём в частоте
nOffset -смещение
Boolean bDoubleEdge двойной край (фронт)
Boolean bPolarity переключение на отрицательные импульсы
nDuration - длительность импульса
nErrIn - я так думаю ошибка (входящая?)
pnErrOut -тоже ошибка (исходящая?)
сейчас основная идея понять в каких единицах задаётся период, думаю, что в мс. судя по коду смещение и длительность импульса задаётся в процентах.
потом соответственно поменять нужные циферки и дело в шляпе ( это я так надеюсь на простое решение проблемы )
даже ограничения какие-то есть, что больше 100% быть не може, аналогично канал ШИМ от 1 до 6,
if (nErrIn) {
if (pnErrOut) {
*pnErrOut = nErrIn;
}
return;
}
if (pnErrOut) {
*pnErrOut = 0;
}
if (nChan < 1 || nChan > 6) {
if (pnErrOut) {
*pnErrOut = 1;
}
return;
}
if (bDoubleEdge && ((nOffset + nDuration) > 100)) {
if (pnErrOut) {
*pnErrOut = 1;
}
return;
}
else if (!bDoubleEdge && nOffset > 100) {
if (pnErrOut) {
*pnErrOut = 1;
}
return;
}
пока такие мысли в голову влезли )