我用STM32L011D3和一个LED搭建了一个小板。我想使用38kHz的LED,占空比为50%。现在,我将LED连接到MCU的错误引脚,因此无法直接将定时器用作PWM发生器。所以我试图在主循环中手动生成PWM信号。我以为这样会行得通,因为实际上我没有在MCU上做任何其他事情。
所以这意味着我应该有4MHz / 4/26 = 38.461kHz
通过这种设置,我得到了大约37us / 37us的折扣。时间不太稳定。
可能是,我启用/禁用led的指令太长而无法在25us内全部执行,以获得稳定的pwm输出?
您正在浪费时间阅读输出-对其进行设置,所以您已经知道它是什么了:
for(;;)
{
int out = (timer2Value >= 13) ? GPIO_PIN_SET : GPIO_PIN_RESET ;
HAL_GPIO_WritePin( GPIOA, GPIO_PIN_7, out ) ;
}
如果时间没有改变,那么问题很可能是您的时钟未以您认为的频率运行。
更具确定性的解决方案(缺少纠正硬件设计的方法是,设置计时器以38000 -1的间隔生成中断,并在中断处理程序中切换输出:]]
void TIM2_IRQHandler() { static int out = 0 ; out = out ? 0 : 1 ; HAL_GPIO_WritePin( GPIOA, GPIO_PIN_7, out ) ; }
甚至只是:
void TIM2_IRQHandler()
{
HAL_GPIO_TogglePin( GPIOA, GPIO_PIN_7 ) ;
}