OpenEdv-开源电子网

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

【阿祖】关于互补PWM插入死区的看法和对其他贴子的理解

[复制链接]

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2015-12-2
在线时间
16 小时
发表于 2016-7-10 19:58:27 | 显示全部楼层 |阅读模式
本帖最后由 阿祖32 于 2016-7-11 10:47 编辑

【阿祖】

大概是弄了将近三天,从刚刚开始看贴子看书和自己以前的程序调,一直在弄这个死区时长的设置,当然在原子论坛上面也看了很多前辈的贴子,深有感悟,在今天晚上调试死区时长的时候,现象出现了,自认为已经接近成功了,下面将会阐述我自己的观点和看法,可能语言组织和对于问题的看法不甚成熟,恳请大家批评指正


[mw_shl_code=c,true]        TIM1_PWM_Init(399,8);
        TIM1->CCR1        =        200;
        TIM1->CCER        |=        0X01;[/mw_shl_code]
[mw_shl_code=c,true]void TIM1_PWM_Init(u16 arr,u16 psc)                //arr:自动重装值,决定PWM输出频率;
                                                                                                                                                        //psc:时钟预分频数,决定计数器频率;
{
        RCC->APB2ENR|=1<<11;                //TM1时钟使能;      
        RCC->APB2ENR|=1<<2;     //GPIOA时钟使能;   STM32_参考手册-中文.pdf (12.74 MB, 下载次数: 0)
山不在高,有仙则名。水不在深,有龙则灵。斯是陋室,惟吾德馨。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2015-12-2
在线时间
16 小时
 楼主| 发表于 2016-7-10 20:34:57 | 显示全部楼层
接下来贴出我两段代码的实际效果:
C:\Documents and Settings\Administrator\桌面\死区图片
山不在高,有仙则名。水不在深,有龙则灵。斯是陋室,惟吾德馨。
回复 支持 反对

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-7-10 20:38:12 | 显示全部楼层
不错,多谢分享。还有,2楼里面的图片不见了
开往春天的手扶拖拉机
回复 支持 反对

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2015-12-2
在线时间
16 小时
 楼主| 发表于 2016-7-10 20:40:44 | 显示全部楼层
zuozhongkai 发表于 2016-7-10 20:38
不错,多谢分享。还有,2楼里面的图片不见了

它提示写上图片路径,不会弄,糗大了。主贴下面贴了。
山不在高,有仙则名。水不在深,有龙则灵。斯是陋室,惟吾德馨。
回复 支持 反对

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2015-12-2
在线时间
16 小时
 楼主| 发表于 2016-7-10 20:45:41 | 显示全部楼层
上面有五张效果图,1-3是同一段程序写的,效果为死区时间为12us,频率为10K,占空比为40%。
4-5是另一端程序写的,效果为死区时间为200us,频率为1K,占空比为40%。
山不在高,有仙则名。水不在深,有龙则灵。斯是陋室,惟吾德馨。
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2016-1-21
在线时间
20 小时
发表于 2016-7-11 09:13:34 | 显示全部楼层
楼主的调试功力值得学习
回复 支持 反对

使用道具 举报

66

主题

364

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2015-6-18
在线时间
129 小时
发表于 2016-7-11 09:39:41 | 显示全部楼层
马克      
回复 支持 反对

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2015-12-2
在线时间
16 小时
 楼主| 发表于 2016-7-11 10:14:29 | 显示全部楼层
一大早上又看了下自己的贴子,发现有些地方说的还不是很详细。
主贴下面的调试结果的参数如下:1-3的程序设置参数为:APB2为4分频,TIM1_PWM_Init(399,8),CCR1=208,BDTR |= 0XD6
                                                    4-5的程序设置参数为:APB2为16分频,TIM1_PWM_Init(399,8),CCR1=500,BDTR |= 0XF8
山不在高,有仙则名。水不在深,有龙则灵。斯是陋室,惟吾德馨。
回复 支持 反对

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2015-12-2
在线时间
16 小时
 楼主| 发表于 2016-7-11 10:26:17 | 显示全部楼层

还有关于APB2(PCLK2)如何进行分频我在主贴里面没有说到,这里阐述下:

分不分频由 时钟配置寄存器(RCC_CFGR)里面的位13:11(PPRE2[2:0])来决定,分频系数:0xx为不分频,100为2分频,101为4分频,110为8分频,111为16分频。

具体寄存器实现代码如下:

[mw_shl_code=c,true]        /*-----------APB2分频系数设定---------*/
        RCC->CFGR        |= (1<<11);
        RCC->CFGR        |= (1<<12);
        RCC->CFGR        |= (1<<13);
        /*-----------APB2分频系数设定---------*/[/mw_shl_code]


那个 RCC->CFGR |= (1<<11) 的意思为寄存器RCC_CFGR的第11位置1,下同理。 111 ,即为16分频,实际频率为 72/16*2=9,因为分频系数不为1分频之后还要乘以2

假如要置 0 的话,就这样写 : RCC->CFRG &= ~(1<<11),即为第11位置 0。

设置分频系数和分不分频,分频多少都直接影响到Tdts的值!

山不在高,有仙则名。水不在深,有龙则灵。斯是陋室,惟吾德馨。
回复 支持 反对

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2015-12-2
在线时间
16 小时
 楼主| 发表于 2016-7-11 10:30:45 | 显示全部楼层
本帖最后由 阿祖32 于 2016-7-11 10:53 编辑

楼层导航:



主贴                             位于 1L

效果图的信息参数           位于 5L

效果图的程序设置参数     位于 8L

APB2寄存器操作分频设置 位于 9L




=====================说明====================

如果有论坛朋友想要引用我帖子里面的内容请先与我联系(有的话那真是

极好的),毕竟写帖子截图啊说明啊真的好累人啊!

=====================说明====================




STM32_参考手册-中文.pdf

12.74 MB, 下载次数: 101

山不在高,有仙则名。水不在深,有龙则灵。斯是陋室,惟吾德馨。
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2016-7-11 10:45:11 | 显示全部楼层
收藏一记,有时间细细学习一下,谢谢分享
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2016-1-1
在线时间
12 小时
发表于 2016-7-16 13:19:12 | 显示全部楼层
楼主引用的帖子没有死区,个人感觉是PWM周期太大了,而死区只有几us,看不出来`
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2016-1-1
在线时间
12 小时
发表于 2016-7-16 13:36:18 | 显示全部楼层
只要初始化改好 比如TIM1_PWM_Init(499,8); 然后死区设置比如TIM1->BDTR|=0xd6;       //死区时间设置
就好了 ,亲测^-^  (宝宝微信 i1012638162)
回复 支持 反对

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2015-12-2
在线时间
16 小时
 楼主| 发表于 2016-7-24 18:18:01 | 显示全部楼层
1012638162 发表于 2016-7-16 13:19
楼主引用的帖子没有死区,个人感觉是PWM周期太大了,而死区只有几us,看不出来`

请问你亲自用示波器看过没有?我引用的帖子都是讲死区的,谢谢。请仔细看完帖子再回复。
山不在高,有仙则名。水不在深,有龙则灵。斯是陋室,惟吾德馨。
回复 支持 反对

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2015-12-2
在线时间
16 小时
 楼主| 发表于 2016-7-24 18:18:30 | 显示全部楼层
1012638162 发表于 2016-7-16 13:36
只要初始化改好 比如TIM1_PWM_Init(499,8); 然后死区设置比如TIM1->BDTR|=0xd6;       //死区时间设置
就 ...

刚开始我也是这么想得。然而。
山不在高,有仙则名。水不在深,有龙则灵。斯是陋室,惟吾德馨。
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2016-1-1
在线时间
12 小时
发表于 2016-7-27 20:54:37 | 显示全部楼层
阿祖32 发表于 2016-7-24 18:18
刚开始我也是这么想得。然而。

亲测~~~~~~~~
回复 支持 反对

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2015-7-18
在线时间
15 小时
发表于 2016-9-1 16:28:35 | 显示全部楼层
大赞楼主的分享。
但是有个问题想问一下楼主,你说4-5图是200us,频率为1K。但是你说程序设定是APB2为16分频,TIM1_PWM_Init(399,8),CCR1=500,BDTR |= 0XF8。按照楼主的计算方式应该是:Tdts=72MHz*2/16=9MHz,DT=(32+24)*16/9M=99us,PWM频率应该是9M/(400*9)=2.5KHz,跟楼主说的不一样。我用示波器看了一下,死区确实是99us(楼主你的图5表明死区也是99us呀,不是200us),但是PWM波频率是1.25KHz(跟你说的计算方法不一样)。不知道是我自己理解有问题,还是计算公式或者哪有问题
学到老,活到老
回复 支持 反对

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2015-12-2
在线时间
16 小时
 楼主| 发表于 2016-9-13 10:22:31 | 显示全部楼层
bigrats 发表于 2016-9-1 16:28
大赞楼主的分享。
但是有个问题想问一下楼主,你说4-5图是200us,频率为1K。但是你说程序设定是APB2为16分 ...

请问这位朋友你的程序能不能贴出来?
[mw_shl_code=c,true]                #include "stm32f10x.h"
                #include "TIM_DT.h"

                int main()
                {       
                TIM1_PWM_Init(999,8);
                        TIM1->CCR1        =        500;
                        TIM1->CCER        |=        0X01;
                        while(1)
                        {
                        }
                }
               
                效果:实际频率 1K
                                        实际占空比 40%
                                        死区 100us[/mw_shl_code]
上面这个程序是主程序,然后预分频为“111”也就是16分频,那么Tdts就是9MHZ,72*2/16=9。
上面主程序的效果是        效果:实际频率 1K
                                        实际占空比 40%
                                        死区 100us
频率1K是通过 9/(999+1)=1K
死区按照公式方法算就可以了。重要的是分频系数!占空比就更好算了,(500-100)*1000=40%,100是有 死区时间占输出波形周期的比值乘以(999+1),然后500减去前面的100再除以1000就可以了。
山不在高,有仙则名。水不在深,有龙则灵。斯是陋室,惟吾德馨。
回复 支持 反对

使用道具 举报

17

主题

237

帖子

0

精华

高级会员

Rank: 4

积分
925
金钱
925
注册时间
2012-2-27
在线时间
393 小时
发表于 2016-9-13 11:04:47 | 显示全部楼层
谢谢楼主
回复 支持 反对

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2015-12-2
在线时间
16 小时
 楼主| 发表于 2016-9-13 11:07:58 | 显示全部楼层

哈哈,乐在分享
山不在高,有仙则名。水不在深,有龙则灵。斯是陋室,惟吾德馨。
回复 支持 反对

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2015-7-18
在线时间
15 小时
发表于 2016-9-23 17:20:32 | 显示全部楼层
阿祖32 发表于 2016-9-13 10:22
请问这位朋友你的程序能不能贴出来?
[mw_shl_code=c,true]                #include "stm32f10x.h"
                #include "TIM_ ...

谢谢楼主细致的解答,楼主的算法是对的!频率的话我知道是什么问题了,我用的是输出比较模式,PWM频率是应该用楼主的方式算出来再除以2,所以就是1.25KHz了。
学到老,活到老
回复 支持 反对

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2015-12-2
在线时间
16 小时
 楼主| 发表于 2016-9-27 12:06:19 | 显示全部楼层
bigrats 发表于 2016-9-23 17:20
谢谢楼主细致的解答,楼主的算法是对的!频率的话我知道是什么问题了,我用的是输出比较模式,PWM频率是 ...

好的,重在学习哈哈
山不在高,有仙则名。水不在深,有龙则灵。斯是陋室,惟吾德馨。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 19:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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