OpenEdv-开源电子网

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

本人用TIM4配置PWM,输入166651HZ时示波器检测到13.9KHZ,输入166668HZ时示波器检测到16.7KHZ,求大神破解这是为什么???

[复制链接]

42

主题

191

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2017-12-28
在线时间
62 小时
发表于 2018-3-24 16:21:33 | 显示全部楼层 |阅读模式
6金钱

最佳答案

查看完整内容[请看2#楼]

还在纠结这个问题呢呀?。。。。把72-1分频换成16-1,甚至8-1之类的,尽量让计时器的上限在接近满类型数值(比如u16的上限在6w左右达到你要的那个频率,这样修改这个上限的时候变化量就很小;反之如果你的上限值在10或者20附近,你每改变一次,因为是整数,所以变化量至少是1,这样频率变化就接近1/20或者1/10跳跃较大)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
390
金钱
390
注册时间
2018-3-20
在线时间
80 小时
发表于 2018-3-24 16:21:34 | 显示全部楼层
还在纠结这个问题呢呀?。。。。把72-1分频换成16-1,甚至8-1之类的,尽量让计时器的上限在接近满类型数值(比如u16的上限在6w左右达到你要的那个频率,这样修改这个上限的时候变化量就很小;反之如果你的上限值在10或者20附近,你每改变一次,因为是整数,所以变化量至少是1,这样频率变化就接近1/20或者1/10跳跃较大)
回复

使用道具 举报

42

主题

191

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2017-12-28
在线时间
62 小时
 楼主| 发表于 2018-3-24 16:30:30 | 显示全部楼层
输入142860HZ时检测为125KHZ,142860时为139KHZ
回复

使用道具 举报

42

主题

191

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2017-12-28
在线时间
62 小时
 楼主| 发表于 2018-3-24 16:31:09 | 显示全部楼层
有大神在吗?求解答,急,在线等!!!!!!!
回复

使用道具 举报

42

主题

191

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2017-12-28
在线时间
62 小时
 楼主| 发表于 2018-3-24 16:33:14 | 显示全部楼层
上面写错了,不好意思,是139KHZ,167KHZ
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-3-25 01:14:20 | 显示全部楼层
说明你代码写错了。或者有bug。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

42

主题

191

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2017-12-28
在线时间
62 小时
 楼主| 发表于 2018-3-26 20:34:10 | 显示全部楼层
正点原子 发表于 2018-3-25 01:14
说明你代码写错了。或者有bug。

我这样配置有问题吗?
1.png
回复

使用道具 举报

42

主题

191

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2017-12-28
在线时间
62 小时
 楼主| 发表于 2018-3-26 20:35:41 | 显示全部楼层
正点原子 发表于 2018-3-25 01:14
说明你代码写错了。或者有bug。

有人说预分频设置大了,可是我改小了也不起作用
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-3-27 01:25:30 | 显示全部楼层
imbest 发表于 2018-3-26 20:34
我这样配置有问题吗?

你在我们例程基础上改改,找找感觉吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

42

主题

191

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2017-12-28
在线时间
62 小时
 楼主| 发表于 2018-3-27 08:44:46 | 显示全部楼层
正点原子 发表于 2018-3-27 01:25
你在我们例程基础上改改,找找感觉吧。

基础例程在哪里呀?我买咱的开发板也没有发现有例程呀???
回复

使用道具 举报

42

主题

191

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2017-12-28
在线时间
62 小时
 楼主| 发表于 2018-3-27 08:52:09 | 显示全部楼层
正点原子 发表于 2018-3-27 01:25
你在我们例程基础上改改,找找感觉吧。

找到了!!!
回复

使用道具 举报

42

主题

191

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2017-12-28
在线时间
62 小时
 楼主| 发表于 2018-3-27 17:10:51 | 显示全部楼层
孟亮 发表于 2018-3-27 08:56
还在纠结这个问题呢呀?。。。。把72-1分频换成16-1,甚至8-1之类的,尽量让计时器的上限在接近满类型数值 ...

我试过了,试过9-1和2-1都没什么反应啊,跟72-1一个样
回复

使用道具 举报

10

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
390
金钱
390
注册时间
2018-3-20
在线时间
80 小时
发表于 2018-3-27 17:24:28 | 显示全部楼层
imbest 发表于 2018-3-27 17:10
我试过了,试过9-1和2-1都没什么反应啊,跟72-1一个样

那就是你程序配置的问题了,这个分频系数直接影响到计数速度,如果更改了没变化,说明其他地方有覆盖项。
回复

使用道具 举报

10

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
390
金钱
390
注册时间
2018-3-20
在线时间
80 小时
发表于 2018-3-27 17:29:29 | 显示全部楼层
还有一点,
TIM_SetCompare2(TIMx,oc2_pulse/2);                                                                                                        //翻转占空比:1/2
TIM_SetAutoreload( TIMx, oc2_pulse - 1);                                                                                                //翻转周期:oc2_pulse个脉冲
TIM_Cmd(TIMx, ENABLE);

你没设置这个吧。。。。。而且我的PWM设置里也没看到CtrlPWMOut这个函数。。。
回复

使用道具 举报

10

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
390
金钱
390
注册时间
2018-3-20
在线时间
80 小时
发表于 2018-3-27 17:30:54 | 显示全部楼层
void tim_cfg(TIM_TypeDef* TIMx)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        TIM_OCInitTypeDef TIM_OCInitStructure;
       
        uint32_t RCC_APB1Periph;
        if(TIMx==TIM2)                        RCC_APB1Periph=RCC_APB1Periph_TIM2;
        if(TIMx==TIM3)                        RCC_APB1Periph=RCC_APB1Periph_TIM3;
        if(TIMx==TIM4)                        RCC_APB1Periph=RCC_APB1Periph_TIM4;
        RCC_APB1PeriphClockCmd(RCC_APB1Periph,ENABLE);
        TIM_DeInit(TIMx);
        TIM_InternalClockConfig(TIMx);
        //<h>对于6400细分,CPU压力不大又不会变速太尖锐的计时器频率约2MHz
        //</h>
        //预分频系数为36000-1,这样计数器时钟为72MHz/36 = 2000kHz
        //<o>TIMx预分频系数x,计数器时钟为72MHz/x                <18=> 18(4MHz)   <36=> 36(2MHz)
        //                                              <72=> 72(1MHz)  <144=> 144(0.5MHz)
        TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1;                                                       
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;                                        //设置时钟分割
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up ;                        //设置计数器模式为向上计数模式
        TIM_TimeBaseStructure.TIM_Period = 40 - 1;                                                                //设置计数溢出大小,每计20000个数就产生一个更新事件
        TIM_TimeBaseInit(TIMx,&TIM_TimeBaseStructure);                                                        //将配置应用到TIM2中
        TIM_ARRPreloadConfig(TIMx, ENABLE);                                                                                //使能ARR预装载缓冲器
        TIM_UpdateRequestConfig(TIMx,TIM_UpdateSource_Regular);

        //下面是对TIM_OCInitStructure的配置
        TIM_OCStructInit(& TIM_OCInitStructure);
        TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;                                                //管脚输出模式:有效
//        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;                                                //管脚输出模式:翻转
        TIM_OCInitStructure.TIM_Pulse = TIM_TimeBaseStructure.TIM_Period/2;                //占空比1/2
        //(设置向导用指令)c1> TIM2 输出通道 [使能|失能]
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;                        //失能TIM2_后续选择通道
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                        //使能TIM2_后续选择通道
        ///*c>(设置向导用指令)
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;                                //输出为正逻辑
        TIM_OC2Init(TIMx, &TIM_OCInitStructure);                                                                //写入配置
        //开启TIM2的中断
        TIM_OC2PreloadConfig(TIMx, TIM_OCPreload_Enable);                                                //输出比较预装使能
        TIM_ClearFlag(TIMx, TIM_IT_Update);
        TIM_ITConfig(TIMx,TIM_IT_Update,ENABLE);
        TIM_ClearFlag(TIMx, TIM_IT_CC2);
        TIM_ITConfig(TIMx,TIM_IT_CC2,DISABLE);
        TIM_Cmd(TIMx, DISABLE);//使能TIMx外设
}

很久以前写的,看看有没有参考吧
回复

使用道具 举报

42

主题

191

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2017-12-28
在线时间
62 小时
 楼主| 发表于 2018-3-28 20:58:21 | 显示全部楼层
孟亮 发表于 2018-3-27 08:56
还在纠结这个问题呢呀?。。。。把72-1分频换成16-1,甚至8-1之类的,尽量让计时器的上限在接近满类型数值 ...

之前弄错了,分频换小是好使的,谢谢了,解决了个大问题,灰常感谢!!!
回复

使用道具 举报

10

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
390
金钱
390
注册时间
2018-3-20
在线时间
80 小时
发表于 2018-3-28 21:28:57 来自手机 | 显示全部楼层
imbest 发表于 2018-3-28 20:58
之前弄错了,分频换小是好使的,谢谢了,解决了个大问题,灰常感谢!!!

这可真属于小问题…大神们都不好意思回答的…自动加载值也可以变频率的哦,还有cpu分频也能降
回复

使用道具 举报

42

主题

191

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2017-12-28
在线时间
62 小时
 楼主| 发表于 2018-3-29 11:21:23 | 显示全部楼层
孟亮 发表于 2018-3-28 21:28
这可真属于小问题…大神们都不好意思回答的…自动加载值也可以变频率的哦,还有cpu分频也能降

哈哈哈,原谅我还是个菜鸟
回复

使用道具 举报

10

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
390
金钱
390
注册时间
2018-3-20
在线时间
80 小时
发表于 2018-3-29 12:10:19 | 显示全部楼层
imbest 发表于 2018-3-29 11:21
哈哈哈,原谅我还是个菜鸟

念在你设置了最佳的份上,友情提示一下,改变占空比或者频率时,记得打开影子寄存器和使用
TIM_SetCompare  和  TIM_SetAutoreload  在更新事件时更改,不要使用TIM_OC2Init(TIMx, &TIM_OCInitStructure)更新参数,这个库函数最后有一行,立即更改,会造成计数错误。
回复

使用道具 举报

42

主题

191

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2017-12-28
在线时间
62 小时
 楼主| 发表于 2018-3-29 13:36:05 | 显示全部楼层
孟亮 发表于 2018-3-29 12:10
念在你设置了最佳的份上,友情提示一下,改变占空比或者频率时,记得打开影子寄存器和使用
TIM_SetCompa ...

好的,谢了
回复

使用道具 举报

19

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2018-1-28
在线时间
30 小时
发表于 2018-3-29 19:14:24 | 显示全部楼层
孟亮 发表于 2018-3-29 12:10
念在你设置了最佳的份上,友情提示一下,改变占空比或者频率时,记得打开影子寄存器和使用
TIM_SetCompa ...

不能不能给我讲一下这段函数是怎样调节比较寄存器的值并且使占空比越来越大的   这段函数没看懂
   while(1)
        {
                delay_ms(10);         
                if(dir)led0pwmval++;
                else led0pwmval--;

                if(led0pwmval>300)dir=0;
                if(led0pwmval==0)dir=1;                                                                                 
                TIM_SetCompare2(TIM3,led0pwmval);                  
        }         
}
回复

使用道具 举报

10

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
390
金钱
390
注册时间
2018-3-20
在线时间
80 小时
发表于 2018-3-29 21:21:51 来自手机 | 显示全部楼层
M3初学者 发表于 2018-3-29 19:14
不能不能给我讲一下这段函数是怎样调节比较寄存器的值并且使占空比越来越大的   这段函数没看懂
   whil ...

这个就是简单的递增或递减一个值,这个值被设置成TIM3比较输出2的值,从0到300变化,猜测用中央对齐,这个比较值就是占空比的一个参数,越大占空比越大
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 00:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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