使用库函数的方式配置TIM10和TIM14两个定时器为PWM波发生器,使用相同的时钟源、预分频和重新装载值。
但测出的最终频率TIM10为300Hz,TIM14为150Hz,相差一倍。不知是什么原因,请大神请教!源码如下:
main.c
[mw_shl_code=applescript,true]int main(void)
{
u8 dir=1;
u16 led0pwmval=0;
Cache_Enable(); //´ò¿ªL1-Cache
HAL_Init(); //³õʼ»¯HAL¿â
Stm32_Clock_Init(432,25,2,9); //ÉèÖÃʱÖÓ,216Mhz
delay_init(216); //ÑÓʱ³õʼ»¯
uart_init(115200); //´®¿Ú³õʼ»¯
TIM10_PWM_Init(2500-1,288);
TIM14_PWM_Init(2500-1,288);
while(1);
}[/mw_shl_code]
timer.c
[mw_shl_code=c,true]//TIM10 PWM²¿·Ö³õʼ»¯
//PWMÊä³ö³õʼ»¯
//arr£º×Ô¶¯ÖØ×°Öµ
//psc£ºÊ±ÖÓÔ¤·ÖƵÊý
void TIM10_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_TIM10_CLK_ENABLE(); /* ?????10 */
__HAL_RCC_GPIOF_CLK_ENABLE(); /* ??GPIOF?? */
GPIO_Initure.Pin = GPIO_PIN_6; /* PF6 */
GPIO_Initure.Mode = GPIO_MODE_AF_PP; /* ?????? */
GPIO_Initure.Pull = GPIO_PULLDOWN; /* ?? */
GPIO_Initure.Speed = GPIO_SPEED_HIGH; /* ?? */
GPIO_Initure.Alternate = GPIO_AF3_TIM10; /* PF6 ???TIM10 */
HAL_GPIO_Init(GPIOF, &GPIO_Initure);
TIM10_Handler.Instance=TIM10; //¶¨Ê±Æ÷3
TIM10_Handler.Init.Prescaler=psc; //¶¨Ê±Æ÷·ÖƵ
TIM10_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//ÏòÉϼÆÊýģʽ
TIM10_Handler.Init.Period=arr; //×Ô¶¯ÖØ×°ÔØÖµ
TIM10_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
HAL_TIM_PWM_Init(&TIM10_Handler); //³õʼ»¯
WM
TIM10_CH4Handler.OCMode=TIM_OCMODE_PWM1; //ģʽѡÔñ
WM1
TIM10_CH4Handler.Pulse=arr/2; //ÉèÖñȽÏÖµ,´ËÖµÓÃÀ´È·¶¨Õ¼¿Õ±È£¬
//ĬÈϱȽÏֵΪ×Ô¶¯ÖØ×°ÔØÖµµÄÒ»°ë,¼´Õ¼¿Õ±ÈΪ50%
TIM10_CH4Handler.OCPolarity=TIM_OCPOLARITY_LOW; //Êä³ö±È½Ï¼«ÐÔΪµÍ
HAL_TIM_PWM_ConfigChannel(&TIM10_Handler,&TIM10_CH4Handler,TIM_CHANNEL_1);//ÅäÖÃTIM3ͨµÀ4
HAL_TIM_PWM_Start(&TIM10_Handler,TIM_CHANNEL_1);//¿ªÆô
WMͨµÀ4
}
//TIM14 PWM²¿·Ö³õʼ»¯
//PWMÊä³ö³õʼ»¯
//arr£º×Ô¶¯ÖØ×°Öµ
//psc£ºÊ±ÖÓÔ¤·ÖƵÊý
void TIM14_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_TIM14_CLK_ENABLE(); /* ?????10 */
__HAL_RCC_GPIOF_CLK_ENABLE(); /* ??GPIOF?? */
GPIO_Initure.Pin = GPIO_PIN_9; /* PF9 */
GPIO_Initure.Mode = GPIO_MODE_AF_PP; /* ?????? */
GPIO_Initure.Pull = GPIO_PULLDOWN; /* ?? */
GPIO_Initure.Speed = GPIO_SPEED_HIGH; /* ?? */
GPIO_Initure.Alternate = GPIO_AF9_TIM14; /* PF9 ???TIM14 */
HAL_GPIO_Init(GPIOF, &GPIO_Initure);
TIM14_Handler.Instance=TIM14; //¶¨Ê±Æ÷3
TIM14_Handler.Init.Prescaler=psc; //¶¨Ê±Æ÷·ÖƵ
TIM14_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//ÏòÉϼÆÊýģʽ
TIM14_Handler.Init.Period=arr; //×Ô¶¯ÖØ×°ÔØÖµ
TIM14_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
HAL_TIM_PWM_Init(&TIM14_Handler); //³õʼ»¯
WM
TIM14_CH4Handler.OCMode=TIM_OCMODE_PWM1; //ģʽѡÔñ
WM1
TIM14_CH4Handler.Pulse=arr/2; //ÉèÖñȽÏÖµ,´ËÖµÓÃÀ´È·¶¨Õ¼¿Õ±È£¬
//ĬÈϱȽÏֵΪ×Ô¶¯ÖØ×°ÔØÖµµÄÒ»°ë,¼´Õ¼¿Õ±ÈΪ50%
TIM14_CH4Handler.OCPolarity=TIM_OCPOLARITY_LOW; //Êä³ö±È½Ï¼«ÐÔΪµÍ
HAL_TIM_PWM_ConfigChannel(&TIM14_Handler,&TIM14_CH4Handler,TIM_CHANNEL_1);//ÅäÖÃTIM3ͨµÀ4
HAL_TIM_PWM_Start(&TIM14_Handler,TIM_CHANNEL_1);//¿ªÆô
WMͨµÀ4
}[/mw_shl_code]
结果:
测试的确是这个原因,两个定时器的时钟源不同,一个是APB1,一个是APB2。而且这两个时钟源刚好差一倍
一周热门 更多>