OpenEdv-开源电子网

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

STM32的PWM频率只能达到140多KHZ吗?

[复制链接]

1

主题

5

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2019-10-1
在线时间
8 小时
发表于 2020-10-31 17:32:02 | 显示全部楼层 |阅读模式
void TIM1_Mode_Config(void)
{  
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;   
        TIM_OCInitTypeDef TIM_OCInitStructure;  
        TIM_BDTRInitTypeDef TIM_BDTRInitStructure;  
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);   
        
        /* Time base configuration */   
        TIM_TimeBaseStructure.TIM_Period = 500-1;    //72000000/1000=72K  //1MHZ
        TIM_TimeBaseStructure.TIM_Prescaler = 0;   
        TIM_TimeBaseStructure.TIM_ClockDivision = 0;  
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);   
        TIM_ARRPreloadConfig(TIM1,ENABLE);      
        /* PWM1 Mode configuration: Channel1 */   
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;   
        TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;  
        TIM_OCInitStructure.TIM_Pulse = CCR1_Val;  
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  
        TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;  
        TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;  
        TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;  
        TIM_OC1Init(TIM1, &TIM_OCInitStructure);
        TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  
        
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;   
        TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;  
        TIM_OCInitStructure.TIM_Pulse = CCR2_Val;   
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
        TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;  
        TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;  
        TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;  
        TIM_OC2Init(TIM1, &TIM_OCInitStructure);
        TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);   
        TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;  
        TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
        
        TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
        TIM_BDTRInitStructure.TIM_DeadTime = 0x30;
        TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
        TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
        TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
        TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);
        TIM_Cmd(TIM1, ENABLE);
        TIM_CtrlPWMOutputs(TIM1, ENABLE);
}
为什么PWM频率只能达到143K,初值装600就测试不到波形了,有什么方法可以达到1MHZ吗?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

459

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4512
金钱
4512
注册时间
2018-5-14
在线时间
964 小时
发表于 2020-11-2 11:02:46 | 显示全部楼层
本帖最后由 姚先起 于 2020-11-2 11:04 编辑

到不了1M的。预分频寄存器不给,打个比方,预分频给0(不分频),那么初始化的值只能到72才能输出1M。这样的PWM分辨率也就到1.38%。如果你预装值给500,那就是0.14371257485029940119760479041916MHz。频率和分辨率始终都要舍弃一样才行
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2019-10-1
在线时间
8 小时
 楼主| 发表于 2020-11-2 11:05:07 | 显示全部楼层
姚先起 发表于 2020-11-2 11:02
到不了1M的。预分频寄存器不给,打个比方,预分频给0(不分频),那么初始化的值只能到72才能输出1M。这样 ...

受教了
回复 支持 反对

使用道具 举报

2

主题

459

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4512
金钱
4512
注册时间
2018-5-14
在线时间
964 小时
发表于 2020-11-2 15:03:31 | 显示全部楼层

你可以用F4系统,用429的主频180MHZ,到APB2的定时器时钟能到180MHZ,如果降频到100MHZ,输出1MHZ 1%占空比精度的PWM还是可以的。就是PWM输出到1M的场合不多见吧
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2019-10-1
在线时间
8 小时
 楼主| 发表于 2020-11-3 09:02:32 | 显示全部楼层
姚先起 发表于 2020-11-2 15:03
你可以用F4系统,用429的主频180MHZ,到APB2的定时器时钟能到180MHZ,如果降频到100MHZ,输出1MHZ 1%占空 ...

谢谢,已经解决了
回复 支持 反对

使用道具 举报

2

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2016-11-18
在线时间
9 小时
发表于 2020-11-6 10:00:43 | 显示全部楼层
guoyunzhi 发表于 2020-11-3 09:02
谢谢,已经解决了

您好请问您怎么解决的,我想做一个500Khz的PWM,目前还输不出来
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2019-10-1
在线时间
8 小时
 楼主| 发表于 2020-11-18 08:40:16 | 显示全部楼层
void WM_125K(u8 arr,u8 Pulse, u8 time  )
{
   GPIO_InitTypeDef GPIO_InitStructure;
   TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
   TIM_OCInitTypeDef TIM_OCInitStructure;
                TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE,ENABLE);
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
     
         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
         GPIO_Init(GPIOB, &GPIO_InitStructure);
         
         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 ;
         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
         GPIO_Init(GPIOA, &GPIO_InitStructure);

   TIM_BaseInitStructure.TIM_Period = arr;//384/2/3+6.4;//576-1;//   //125kHZ  (72M/125k)-1=575
   TIM_BaseInitStructure.TIM_Prescaler = 0;
   TIM_BaseInitStructure.TIM_ClockDivision = 0;
   TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
   TIM_BaseInitStructure.TIM_RepetitionCounter = 0;
   TIM_TimeBaseInit(TIM1, &TIM_BaseInitStructure);
   
    TIM_ARRPreloadConfig(TIM1, ENABLE);

   
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OCInitStructure.TIM_OCNPolarity =TIM_OCNPolarity_High; //TIM_OCNPolarity_Low;
                TIM_OCInitStructure.TIM_OCIdleState  = TIM_OCIdleState_Set;        
    TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;   
    TIM_OCInitStructure.TIM_Pulse = Pulse;//192/2/4+2.4;///288;  //
    TIM_OC1Init(TIM1, &TIM_OCInitStructure);

   
    TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);   
   
    TIM_Cmd(TIM1, ENABLE);
   
    TIM_CtrlPWMOutputs(TIM1, ENABLE);
               
               
                TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);   
//       
        TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;  
        TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
       
        TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
        TIM_BDTRInitStructure.TIM_DeadTime = time;//0x90/16-0.5+0.85;
        TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
        TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
        TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
        TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);

}

WM_125K(384/2/3+6.4,192/2/4+2.4,0x90/16-0.5+0.85);这个是为1MHZ的,你试试,你没有输出考虑是不是占空比没有给到正确的数据
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 12:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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