由于做的下玩意需要使用到pwm输出,于是看了下《
STM32不完全手册》PWM章节的内容,书中提到如果APB1的分频系数不为1,
tiM2-TIM7的时钟为APB1的2倍。
TIMX的定时公式:Time = (arr * (psc + 1)) / SYSCLK 本
开发板APB1的是分频系数为2,所以TIM2-TIM7的时钟源应该是72M
我现在需要使用到20KHz的PWM输出,我使用TIM2提供PWM,占空比调节范围为100,即arr为100,这样psc应该为36-1 分频后TIM2的时钟应该是72/36=2M
但是在使用过程中发现pwm的频率 并不是20K 用示波器一看是10K ,怀疑普通定时器的时钟源是72M吗
因为高级定时器TIM1由APB2提供时钟为72M,所以用同样的参数配置TIM1 相对比一下是否会产生同样频率的输出
配置的函数如下:
void MAL_Timer1PWM_Init(uint16 arr, uint16 psc)
{
//Enable Timer2 Clock and GPIOA Clock
APB2PeripheralClock_Enable(APB2PeripheralClock_TIM1);
APB2PeripheralClock_Enable(APB2PeripheralClock_GPIOA);
//GPIO config
MAL_GPIO_Mode_Set(GPIO_A, GPIO_Mode_AF_PP, 8); //PA_8 -> GPIO_Mode_AF_PP
BIT_SET(GPIOA->BRR, 8);
BIT_SET(TIM1->BDTR, 15);
TIM1->ARR = arr;
TIM1->SC = psc;
//PWM config CH1
TIM1->CCMR1 |= 6<<4; //OC1M -> 110(PWM1)
BIT_SET(TIM1->CCMR1, 3); //OC1PE -> 1
BIT_SET(TIM1->CCER, 0); //OC1 -> 1
BIT_SET(TIM1->CR1, 7); //APRE Enable
BIT_SET(TIM1->CR1, 0); //Timer Enable
}
void MAL_Timer2PWM_Init(uint16 arr, uint16 psc)
{
//Enable Timer2 Clock and GPIOA Clock
APB1PeripheralClock_Enable(APB1PeripheralClock_TIM2);
APB2PeripheralClock_Enable(APB2PeripheralClock_GPIOA);
//GPIO config
MAL_GPIO_Mode_Set(GPIO_A, GPIO_Mode_AF_PP, 1); //PA_1 -> GPIO_Mode_AF_PP
BIT_SET(GPIOA->BRR, 1);
MAL_GPIO_Mode_Set(GPIO_A, GPIO_Mode_AF_PP, 2); //PA_2 -> GPIO_Mode_AF_PP
BIT_SET(GPIOA->BRR, 2);
TIM2->ARR = arr;
TIM2->SC = psc;
//PWM config CH2
TIM2->CCMR1 |= 6<<12; //OC2M -> 110(PWM1)
BIT_SET(TIM2->CCMR1, 11); //OC2PE -> 1
BIT_SET(TIM2->CCER, 4); //OC2 -> 1
BIT_SET(TIM2->CR1, 7); //APRE Enable
BIT_SET(TIM2->CR1, 0); //Timer Enable
}
void Motor_RS380_Init(void)
{
MAL_Timer1PWM_Init(100, 35);
MAL_Timer2PWM_Init(100, 35);
TIM1->CCR1 = 50;
TIM2->CCR2 = 50;
}
先通过Simulator模式看一下输出:
上面为TIM2 CH2产生的PWM
下面为TIM1 CH1产生的PWM
2个定时器的配置参数完全一样
同样50%的占空比
但是可以从图中看出TIM1输出的PWM
比TIM2输出的PWM频率高了1倍
从时间上来看 TIM1输出的频率是20K
TIM2输出的频率为10K
这样来算的TIM2的时钟源应该是36M啊
而不是72M
TIM1的时钟源是72M
再把开发板接到示波器上看一下
示波器也显示 TIM2输出的是10K 而TIM1刚好是TIM2的2倍
求原子哥以及各位高人讲解一下 TIM2的时钟源究竟是36M还是72M 还是我配置的哪里有问题