创建新的工程,进入MCC设置,将板子上的RF3设置为PWM11输出功能。生成代码,然后进入到pwm1_16bit.c文件,查看生成的可用函数。
根据名字我们就可以确定一些函数的意义。
void PWM1_16BIT_WritePeriodRegister(uint16_t periodCount)
{
PWM1PRL = (uint8_t)periodCount;
PWM1PRH = (uint8_t)(periodCount >> 8);
}
void PWM1_16BIT_SetSlice1Output1DutyCycleRegister(uint16_t registerValue)
{
PWM1S1P1L = (uint8_t)(registerValue);
PWM1S1P1H = (uint8_t)(registerValue >> 8);
}
void PWM1_16BIT_SetSlice1Output2DutyCycleRegister(uint16_t registerValue)
{
PWM1S1P2L = (uint8_t)(registerValue);
PWM1S1P2H = (uint8_t)(registerValue >> 8);
}
void PWM1_16BIT_LoadBufferRegisters(void)
{
//Load the period and duty cycle registers on the next period event
PWM1CONbits.LD = 1;
}
这几个函数分别是:周期设置,设置输出1的工作时间,设置输出2的工作时间,在下一个周期加载新的周期与工作时间
因此如果我们初始化配置为固定的1KHz,那么这里我们只需要更改工作时间,并加载到下次周期就行了。例如我们在主函数添加如下内容
unsigned int i=0;
while (1)
{
// Add your application code
for(i=1;i<1000;i++)
{
PWM1_16BIT_SetSlice1Output1DutyCycleRegister(i);
PWM1_16BIT_LoadBufferRegisters;
_delay(200);
}
for(i=1000;i>0;i--)
{
PWM1_16BIT_SetSlice1Output1DutyCycleRegister(i);
PWM1_16BIT_LoadBufferRegisters();
_delay(200);
}
}
烧录后,就可以看到开发板上的LED慢慢变亮,又慢慢熄灭了。
建议官方直接提供生成占空比的函数,另外对周期设置与工作时间设置的函数注释提个小建议。
因为是要设置2个寄存器,而注释只说明了一个寄存器的大小,这样不容易理解,建议两个合并后说明
例如设置PWM周期的初始化:
//PWMPRL 231;
PWM1PRL = 0xE7;
//PWMPRH 3;
PWM1PRH = 0x03;
以上内容是设置周期为0x3E7+1,也就是999+1,
而分开注释是什么意思,难以看懂啊。
不如直接注释一条啊
//PWMPR 999;
PWM1PRL = 0xE7;
PWM1PRH = 0x03;
|