OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3829|回复: 4

stm32f767 pwm频率计算问题(求指教)

[复制链接]

1

主题

4

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2013-10-10
在线时间
2 小时
发表于 2018-12-5 10:57:19 | 显示全部楼层 |阅读模式
    使用库函数的方式配置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);       //³õʼ»&#175WM
   
    TIM10_CH4Handler.OCMode=TIM_OCMODE_PWM1; //ģʽѡÔ&#241WM1
    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);//¿ªÆ&#244WMͨµÀ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);       //³õʼ»&#175WM
   
    TIM14_CH4Handler.OCMode=TIM_OCMODE_PWM1; //ģʽѡÔ&#241WM1
    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);//¿ªÆ&#244WMͨµÀ4
}[/mw_shl_code]

结果:
微信图片_20181205105550.jpg

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

34

主题

331

帖子

0

精华

高级会员

Rank: 4

积分
857
金钱
857
注册时间
2018-9-16
在线时间
240 小时
发表于 2018-12-5 14:25:52 | 显示全部楼层
挂载的外设时钟不同,一个是APB1,一个是APB2吧我估计,倍频后定时器的时钟就不同
回复 支持 1 反对 0

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2013-10-10
在线时间
2 小时
 楼主| 发表于 2018-12-6 09:49:31 | 显示全部楼层
plue 发表于 2018-12-5 14:25
挂载的外设时钟不同,一个是APB1,一个是APB2吧我估计,倍频后定时器的时钟就不同

手册上说默认使用相同的时钟源,如果时钟设置问题那具体如何修改呢?或者相关的寄存器是什么?
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2013-10-10
在线时间
2 小时
 楼主| 发表于 2018-12-11 17:27:49 | 显示全部楼层
plue 发表于 2018-12-5 14:25
挂载的外设时钟不同,一个是APB1,一个是APB2吧我估计,倍频后定时器的时钟就不同

测试的确是这个原因,两个定时器的时钟源不同,一个是APB1,一个是APB2。而且这两个时钟源刚好差一倍  
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2013-10-10
在线时间
2 小时
 楼主| 发表于 2018-12-11 17:40:54 | 显示全部楼层
plue 发表于 2018-12-5 14:25
挂载的外设时钟不同,一个是APB1,一个是APB2吧我估计,倍频后定时器的时钟就不同

测试的确是这个原因,两个定时器的时钟源不同,一个是APB1,一个是APB2。而且这两个时钟源刚好差一倍  
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 04:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表