OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 23775|回复: 71

对教程的补充:PWM互补输出及死区时间代码和详解(原创)

  [复制链接]

  离线 

13

主题

774

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2254
金钱
2254
注册时间
2015-7-26
在线时间
577 小时
发表于 2015-11-13 23:39:50 | 显示全部楼层 |阅读模式
正点原子公众号

实战:PWM

 

一直跟着原子哥的教程一直学到PWM这一章发现一头雾水,自己也没发过什么分享帖,感觉原子哥对PWM这章讲的比较少(mini板教程),后面自己上网找了些资料,网上关于PWM讲的也不多,所以学起来也挺困难的,一直对TIM1有7路PWM不理解,自己只能输出4路,另外三路也不知道怎么输出,通过网上少量资料和自己研究发现这三路用于互补输出,互补输出调试出来了发现又有死区时间,主要用于电机的H桥方面的控制,后面附上自己对高级定时器互补输出和死区时间设置的代码和详解。花了两小时整理了下资料,初学者难免有错希望指出,也希望对跟我一样的初学者学习PWM有点帮助

 

先简单了解下PWM和死区时间

简介:

脉冲宽度调制(PWM),是英文“ Pulse Width Modulation” 的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制,高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4路的 PWM 输出,这样, STM32 最多可以同时产生 30 路 PWM 输出!

 

PWM的死区时间:

死区,简单解释:通常,大功率电机、变频器等,末端都是由大功率管、IGBT等元件组成的H桥或3相桥。每个桥的上半桥和下半桥是是绝对不能同时导通的,但高速的PWM驱动信号在达到功率元件的控制极时,往往会由于各种各样的原因产生延迟的效果,造成某个半桥元件在应该关断时没有关断,造成功率元件烧毁。死区就是在上半桥关断后,延迟一段时间再打开下半桥或在下半桥关断后,延迟一段时间再打开上半桥,从而避免功率元件烧毁。这段延迟时间就是死区。(就是上、下半桥的元件都是关断的)死区时间控制在通常的低端单片机所配备的PWM中是没有的。
PWM的上下桥臂的三极管是不能同时导通的。如果同时导通就会是电源两端短路。所以,两路触发信号要在一段时间内都是使三极管断开的。这个区域就叫做“死区”优点就不用说了。缺点是使谐波的含量有所增加。

7路PWM:



代码和详解:
利用高级定时器TIM1输出7路PWM进行观察
需要配置以下寄存器:
捕获/比较模式寄存器(TIMx_CCMR1/2)
捕获/比较使能寄存器(TIMx_CCER)
捕获/比较寄存器(TIMx_CCR1~4)
刹车和死区寄存器(TIMx_BDTR)

按代码行后面的序号解析:
[C] 纯文本查看 复制代码
//TIM1_CH1 PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM1_PWM_Init(u16 arr,u16 psc)
{		 					 
	RCC->APB2ENR|=1<<11; 	//TIM1时钟使能    
	RCC->APB2ENR|=1<<2;     //使能PORTA时钟	   	 
	RCC->APB2ENR|=1<<3;     //使能PORTB时钟	 
	RCC->APB2ENR|=1<<0;     //开启复用时钟	
	
	GPIOA->CRH&=0XFFFF0000;	 //PA8,9,10,11清除之前的设置
	GPIOA->CRH|=0X0000BBBB;	 //PA8,9,10,11复用功能输出 
	
	GPIOB->CRH&=0X000FFFFF;  //PB13,14,15清除之前的设置
	GPIOB->CRH|=0XBBB00000;  //PB13,14,15复用功能输出
	
	GPIOB->ODR|=1<<13;       //PB13 输出上拉,低电平有效
	GPIOB->ODR|=1<<14;       //PB14 
	GPIOB->ODR|=1<<15;       //PB15 
	GPIOA->ODR|=1<<8;        //PA8 
	GPIOA->ODR|=1<<9;        //PA9
	GPIOA->ODR|=1<<10;       //PA10
	
	TIM1->ARR=arr;	        //设定计数器自动重装值     ①1
	TIM1->PSC=psc;	        //预分频器设置             ②2
	
	TIM1->CCER|=1<<0;   	//TIM1CH1 输出使能,高电平有效      ③3
	TIM1->CCER|=1<<4;   	//TIM1CH2 输出使能
	TIM1->CCER|=1<<8;   	//TIM1CH3 输出使能
	TIM1->CCER|=1<<12;      //TIM1CH4 输出使能
	TIM1->CCER|=1<<2;   	//TIM1CH1N 互补输出使能
	TIM1->CCER|=1<<6;   	//TIM1CH2N 互补输出使能
	TIM1->CCER|=1<<10;      //TIM1CH3N 互补输出使能
	
	TIM1->CCMR1|=7<<4;  	//CH1 PWM2模式	       ④4
	TIM1->CCMR1|=1<<3; 	//CH1预装载使能	 

	TIM1->CCMR1|=7<<12;  	//CH2 PWM2模式		 
	TIM1->CCMR1|=1<<11; 	//CH2预装载使能	 

	TIM1->CCMR2|=7<<4;  	//CH3 PWM2模式		 
	TIM1->CCMR2|=1<<3; 	//CH3预装载使能	
 
	TIM1->CCMR2|=7<<12;  	//CH4 PWM2模式		 
	TIM1->CCMR2|=1<<11; 	//CH4预装载使能	 
	
        TIM1->BDTR|=0x14;       //死区时间设置          ⑤5
	TIM1->BDTR|=1<<15;   	//MOE 主输出使能        ⑥6
	TIM1->CR1 |= 0x80;   	//ARPE使能,开始所有输出通道,默认向上计数   ⑦7
	TIM1->CR1 |= 0x01;    	//使能计数器 										  
}

int main(void)
{			
	Stm32_Clock_Init(9);       //系统时钟设置
	delay_init(72);	            //延时初始化 
	TIM1_PWM_Init(499,7199);    // 72M/7200=10khz, 1/10khz * 500=50ms   ⑧8
   	while(1)
	{  					 
		TIM1->CCR1=250;  //占空比:50%  低电平时长25ms   ⑨9
		TIM1->CCR2=125;  //占空比:75%  低电平时长12.5ms
		TIM1->CCR3=50;	  //占空比:90% 低电平时长5ms
		TIM1->CCR4=25;	  //占空比:95%	低电平时长2.5ms	
	} 
}

自动重载,这里重载值为500,50ms一个周期

预分频:7200分频,频率为10KHZ





TIM1->CCER|=1<<0;//0为使能位,位1~3都默认为0,即高电平有效,关闭输入捕获,互补输出极性为“高电平有效,所谓的有效跟④有关,如下


CCMR14~6位为模式设置,,由于我们上面设置为高电平“有效”,这里又设置为PWM2模式,在⑦没有设置TIM1_CR1DIR位,所以默认为0,也就是向上计数,如下


可以推出TIMx_CNT从0开始往上计数,在小于CCR1(第⑨有设置)时会输出无效电平也就是低电平,当大于的时候输出有效电平也就是高电平,这样就达到了设置占空比的目的。一开始我们设ARR为500,CCR1为250,所以一开始输出低电平占50%,高电平也是50%

 

死区时间设置TIM1_BDTR(7:0),我们上面设置的是0x14

DT表示死区持续时间,Tdts为系统时钟周期,Tdtg表示乘以倍数后死区设置时间步进值。


TIM1_BDTR = 0x14是高3位为000,也就是调用以下这个公式(第一个公式),高3位可以根据自己需要设置


可以看到第⑧可以得知Tdts = 10Khz,Tdtg = Tdts = 10Khz,DT = 20(0x14) * 100us(10Khz) = 2000us = 2ms,也就是死区持续时间为2ms,最后配置输出使能



下面是输出的波形



通道1(低电平27ms,高电平23ms)
互补输出的通道(CH1N)(高电平23ms,低电平27ms)



通道2(7ms)



通道3(14.5ms)


通道4(2.5ms)

死区时间(2ms)


由于互补输出且有死区时间所以CH1加了2ms,而CH1N减了2ms,死区时间跟计算的一样是2ms,而最后一个CH4没有互补

输出所以自然是2.5ms不变,由于我们设置的10KHZ,而手册是以8M为例子的,大家也可以试一下,亲测没有问题,如果

8M死区时间精度也更高可以,可以设为usns级别。下面附上这个例程的代码





PWM输出实验(寄存器).zip

979.52 KB, 下载次数: 3184

我的博客:http://blog.csdn.net/itdo_just
回复

使用道具 举报

  离线 

13

主题

774

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2254
金钱
2254
注册时间
2015-7-26
在线时间
577 小时
 楼主| 发表于 2015-12-1 07:54:29 | 显示全部楼层
回复【12楼】正点原子:
---------------------------------
哈哈,感谢原子哥支持!!!!
我的博客:http://blog.csdn.net/itdo_just
回复 支持 1 反对 0

使用道具 举报

  离线 

13

主题

774

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2254
金钱
2254
注册时间
2015-7-26
在线时间
577 小时
 楼主| 发表于 2015-11-30 17:00:16 | 显示全部楼层
回复【7楼】jpf487424:
---------------------------------
站内是可以加为好友的,有任何问题欢迎直接回帖大家一起讨论,也可以发站内短信给我,谢谢
我的博客:http://blog.csdn.net/itdo_just
回复 支持 1 反对 0

使用道具 举报

  离线 

0

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2014-6-5
在线时间
31 小时
发表于 2015-11-14 08:07:31 | 显示全部楼层
写的很好啊,用库方式更加容易理解一点,期待楼主的更多分享!
回复 支持 反对

使用道具 举报

  离线 

13

主题

774

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2254
金钱
2254
注册时间
2015-7-26
在线时间
577 小时
 楼主| 发表于 2015-11-14 08:28:34 | 显示全部楼层
正点原子公众号
回复【2楼】zhanghan4310:
---------------------------------
谢谢支持!!
我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

  离线 

72

主题

2720

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3419
金钱
3419
注册时间
2014-8-4
在线时间
659 小时
发表于 2015-11-14 11:46:25 | 显示全部楼层
非常好的总结~~~~~
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

  离线 

13

主题

774

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2254
金钱
2254
注册时间
2015-7-26
在线时间
577 小时
 楼主| 发表于 2015-11-14 19:54:03 | 显示全部楼层
回复【4楼】龙之谷:
---------------------------------
谢谢支持,O(∩_∩)O哈哈~
我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

  离线 

9

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2015-11-28
在线时间
41 小时
发表于 2015-11-30 16:00:33 | 显示全部楼层
回复【3楼】229382777@qq.com:
---------------------------------
问一下原子的PWM例程为啥没开启复用时钟呢?
回复 支持 反对

使用道具 举报

  离线 

9

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2015-11-28
在线时间
41 小时
发表于 2015-11-30 16:08:04 | 显示全部楼层
回复【3楼】229382777@qq.com:
---------------------------------
能不能加个好友啊,大神,我也是个学生
回复 支持 反对

使用道具 举报

  离线 

13

主题

774

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2254
金钱
2254
注册时间
2015-7-26
在线时间
577 小时
 楼主| 发表于 2015-11-30 17:05:17 | 显示全部楼层
回复【6楼】jpf487424:
---------------------------------
http://www.openedv.com/posts/list/19454.htm建议看下这个帖子
需要的时候必须开,不需要可以不开,开了也没关系
我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

  离线 

9

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2015-11-28
在线时间
41 小时
发表于 2015-11-30 19:12:13 | 显示全部楼层
回复【9楼】229382777@qq.com:
---------------------------------
谢谢
回复 支持 反对

使用道具 举报

  离线 

18

主题

236

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1773
金钱
1773
注册时间
2014-8-5
在线时间
205 小时
发表于 2015-11-30 22:34:27 | 显示全部楼层
谢谢楼主分享,刚好要用上,呵呵,谢谢
回复 支持 反对

使用道具 举报

  离线 

489

主题

9万

帖子

30

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
124825
金钱
124825
注册时间
2010-12-1
在线时间
1051 小时
发表于 2015-11-30 22:37:29 | 显示全部楼层
不错,cool
回复 支持 反对

使用道具 举报

  离线 

6

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2015-12-23
在线时间
16 小时
发表于 2016-1-7 09:03:10 | 显示全部楼层
大神,能指点一下我这个问题么:http://openedv.com/thread-65831-1-1.html
回复 支持 反对

使用道具 举报

  离线 

6

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2015-12-23
在线时间
16 小时
发表于 2016-1-7 09:06:21 | 显示全部楼层
还有,在这个例程中,该例程中对四个通道的CCR寄存器都启用了预装载,请问:这个有什么用,感觉不是必须的,求大神指导一下
回复 支持 反对

使用道具 举报

  离线 

6

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2013-3-20
在线时间
11 小时
发表于 2016-1-11 16:13:34 | 显示全部楼层
好东西
回复 支持 反对

使用道具 举报

  离线 

3

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2015-11-29
在线时间
22 小时
发表于 2016-1-11 21:24:05 | 显示全部楼层
谢谢分享!!!
回复 支持 反对

使用道具 举报

  离线 

8

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
292
金钱
292
注册时间
2011-7-11
在线时间
32 小时
发表于 2016-1-11 23:42:53 | 显示全部楼层
支持了!好东西!
回复 支持 反对

使用道具 举报

  离线 

2

主题

9

帖子

0

精华

新手入门

积分
41
金钱
41
注册时间
2015-12-15
在线时间
1 小时
发表于 2016-1-12 11:11:19 | 显示全部楼层
好东西,顶起
回复 支持 反对

使用道具 举报

  离线 

0

主题

12

帖子

0

精华

新手入门

积分
39
金钱
39
注册时间
2016-1-5
在线时间
10 小时
发表于 2016-1-13 11:13:44 | 显示全部楼层
谢谢分享!!!
这个用在电机驱动上
回复 支持 反对

使用道具 举报

  离线 

5

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
199
金钱
199
注册时间
2015-10-11
在线时间
45 小时
发表于 2016-1-18 20:05:59 | 显示全部楼层
漂亮      
回复 支持 反对

使用道具 举报

  离线 

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2016-1-20
在线时间
8 小时
发表于 2016-1-20 10:44:28 | 显示全部楼层
额。。。我刚接触PWM波,我有个问题想问楼主,就是我想使用通用定时器输出一个PWM波,该PWM波在一个周期内能够出现多个上升沿和多个下降沿,我可不可以在一个周期内设置多个捕获比较寄存器的值,让计数器与这多个值进行比较,比如我设置重载寄存器为999,设置捕获比较寄存器1为300,有效电平为高;捕获比较寄存器2为600,有效电平为低;捕获比较寄存器3为800,有效电平为高。。。。这种方法可行么?。。
回复 支持 反对

使用道具 举报

  离线 

13

主题

774

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2254
金钱
2254
注册时间
2015-7-26
在线时间
577 小时
 楼主| 发表于 2016-1-20 17:00:40 | 显示全部楼层
kiss老黑0.0 发表于 2016-1-20 10:44
额。。。我刚接触PWM波,我有个问题想问楼主,就是我想使用通用定时器输出一个PWM波,该PWM波在一个周期内 ...

没研究过
我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

  离线 

0

主题

2

帖子

0

精华

新手入门

积分
46
金钱
46
注册时间
2016-1-14
在线时间
10 小时
发表于 2016-3-21 23:52:22 | 显示全部楼层
多谢,楼主的分享!学习了,,谢谢,,
回复 支持 反对

使用道具 举报

  离线 

8

主题

109

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2012-5-19
在线时间
142 小时
发表于 2016-3-22 20:48:15 | 显示全部楼层
mdk示波器具体如何使用,设置,求解
回复 支持 反对

使用道具 举报

  离线 

13

主题

774

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2254
金钱
2254
注册时间
2015-7-26
在线时间
577 小时
 楼主| 发表于 2016-3-22 21:59:17 | 显示全部楼层
zhcj66 发表于 2016-3-22 20:48
mdk示波器具体如何使用,设置,求解

原子哥的教程好好看一下,有讲到
我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

  离线 

18

主题

236

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1773
金钱
1773
注册时间
2014-8-5
在线时间
205 小时
发表于 2016-3-28 18:37:45 | 显示全部楼层
谢谢楼主分析,学习了,正准备学习这个,呵呵
回复 支持 反对

使用道具 举报

  离线 

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2016-3-28
在线时间
12 小时
发表于 2016-3-28 18:59:04 | 显示全部楼层
为什么我用你的程序下到我的开发板中没有看到死区的效果,只看到了互补输出。。求解答。
回复 支持 反对

使用道具 举报

  离线 

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2016-3-28
在线时间
12 小时
发表于 2016-3-28 19:01:22 | 显示全部楼层
我用的是示波器观察的
回复 支持 反对

使用道具 举报

  离线 

13

主题

774

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2254
金钱
2254
注册时间
2015-7-26
在线时间
577 小时
 楼主| 发表于 2016-3-28 19:47:32 | 显示全部楼层
杨火祥 发表于 2016-3-28 19:01
我用的是示波器观察的

你再看看代码吧,我没试过用示波器调试这个代码,理论上是没有问题的
我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

  离线 

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2016-3-28
在线时间
12 小时
发表于 2016-3-28 20:30:02 | 显示全部楼层
229382777@qq.co 发表于 2016-3-28 19:47
你再看看代码吧,我没试过用示波器调试这个代码,理论上是没有问题的

没问题啊  我没有改你的代码啊
要不你再把你的代码发我下
回复 支持 反对

使用道具 举报

  离线 

13

主题

774

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2254
金钱
2254
注册时间
2015-7-26
在线时间
577 小时
 楼主| 发表于 2016-3-28 21:23:01 | 显示全部楼层
杨火祥 发表于 2016-3-28 20:30
没问题啊  我没有改你的代码啊
要不你再把你的代码发我下

一样的,代码我没改过,你可以先试试你那边软件仿真,然后再用示波器看,看看软件出来的和示波器一不一样
我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

  离线 

0

主题

14

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2016-2-1
在线时间
1 小时
发表于 2016-3-28 23:32:09 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

  离线 

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2016-3-28
在线时间
12 小时
发表于 2016-3-29 08:08:14 | 显示全部楼层
我知道哪里有问题了,你的程序我一字未改,可是在我上面Tdts是按照72M来的,为什么啊,我的延迟都只有几微妙,预分频是正确的,因为周期我检查了是对的,就是延迟部队,还是按未分频的72M来的
回复 支持 反对

使用道具 举报

  离线 

0

主题

2

帖子

0

精华

新手入门

积分
46
金钱
46
注册时间
2015-8-5
在线时间
8 小时
发表于 2016-4-27 12:03:58 | 显示全部楼层
讲的太好了,终于明白了
回复 支持 反对

使用道具 举报

  离线 

0

主题

9

帖子

0

精华

新手入门

积分
75
金钱
75
注册时间
2016-6-20
在线时间
10 小时
发表于 2016-6-24 13:14:29 | 显示全部楼层
非常感谢楼主分享!

虽说,我没有完全看明白…  还需要多加学习啊…
回复 支持 反对

使用道具 举报

  离线 

7

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2015-5-17
在线时间
11 小时
发表于 2016-7-6 16:37:03 | 显示全部楼层
你好,我想问一下在互补输出的情况下加入刹车功能,那程序设置应该怎么编?在线等,谢谢
回复 支持 反对

使用道具 举报

  离线 

13

主题

774

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2254
金钱
2254
注册时间
2015-7-26
在线时间
577 小时
 楼主| 发表于 2016-7-6 21:23:00 | 显示全部楼层
明书 发表于 2016-7-6 16:37
你好,我想问一下在互补输出的情况下加入刹车功能,那程序设置应该怎么编?在线等,谢谢

这个你自己研究下吧
我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

  离线 

0

主题

8

帖子

0

精华

新手入门

积分
37
金钱
37
注册时间
2015-5-17
在线时间
2 小时
发表于 2016-7-6 21:43:18 | 显示全部楼层
mark. 感谢分享!
回复 支持 反对

使用道具 举报

  离线 

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2015-12-2
在线时间
16 小时
发表于 2016-7-9 20:17:07 | 显示全部楼层
楼主,您好。能否能把你
Stm32_Clock_Init(9);       //系统时钟设置
    delay_init(72);             //延时初始化
这两段函数的具体代码能否贴一下,本人学生,现在正在调试互补PWM,但是死区时间控制和占空比一直调整不好。
山不在高,有仙则名。水不在深,有龙则灵。斯是陋室,惟吾德馨。
回复 支持 反对

使用道具 举报

  离线 

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2015-12-2
在线时间
16 小时
发表于 2016-7-9 20:59:45 | 显示全部楼层
亲测,在未改动代码的情况下,此代码 PA8,PB13只有互补,没有死区,但是keil仿真上面是有死区显示的。
山不在高,有仙则名。水不在深,有龙则灵。斯是陋室,惟吾德馨。
回复 支持 反对

使用道具 举报

头像被屏蔽

  离线 

65

主题

280

帖子

0

精华

高级会员

Rank: 4

积分
670
金钱
670
注册时间
2013-8-11
在线时间
28 小时
发表于 2016-7-10 11:53:59 | 显示全部楼层
写的不错!!!
回复 支持 反对

使用道具 举报

  离线 

4

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2015-11-3
在线时间
27 小时
发表于 2016-7-17 23:56:18 | 显示全部楼层
收藏了,支持楼主库存器版本,因为我觉得寄存器才是王道。库太占空间,效率没有寄存器好,而且不是所有单片机都是向ST一样有库函数操作。
回复 支持 反对

使用道具 举报

  离线 

2

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
277
金钱
277
注册时间
2016-6-18
在线时间
37 小时
发表于 2016-8-3 16:34:25 | 显示全部楼层
好,寄存器写得很清楚,期望楼主多多分享这方面的
回复 支持 反对

使用道具 举报

  离线 

2

主题

36

帖子

0

精华

高级会员

Rank: 4

积分
549
金钱
549
注册时间
2016-1-25
在线时间
44 小时
发表于 2016-8-4 08:09:53 | 显示全部楼层
不错,一大早就看到好帖子,谢谢分享
回复 支持 反对

使用道具 举报

  离线 

4

主题

44

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
274
金钱
274
注册时间
2016-2-3
在线时间
45 小时
发表于 2016-10-8 16:45:45 | 显示全部楼层
很GOOD,搞得我想搞一个特殊的来玩玩
回复 支持 反对

使用道具 举报

  离线 

30

主题

216

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
433
金钱
433
注册时间
2016-4-14
在线时间
95 小时
发表于 2016-10-11 13:51:04 | 显示全部楼层
听君一席话胜读十年书~这个分享给力~
回复 支持 反对

使用道具 举报

  离线 

3

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2016-6-2
在线时间
27 小时
发表于 2016-10-13 11:31:02 | 显示全部楼层
我的照葫芦画瓢,用的STM32F103ZET6,CH2n、CH3N互补PWM无输出

void TIM1_PWM_Init(u16 arr,u16 psc)
{
        RCC->APB2ENR|=1<<11;         //TIM1时钟使能
    RCC->APB2ENR|=1<<2;     //使能PORTA的时钟
    RCC->APB2ENR|=1<<3;     //使能PORTB的时钟
    RCC->APB2ENR|=1<<6;     //使能PORTE的时钟
    RCC->APB2ENR|=1<<0;     //使能复用时钟

    GPIOA->CRH&=0XFFFFF00F;        //PA9、PA10推挽输出
        GPIOA->CRH|=0X00000BB0;       

    GPIOB->CRL&=0XFFFFFF00;        //PB0、PB1推挽输出
        GPIOB->CRL|=0X000000BB;       

        GPIOE->CRL&=0XF0FFFF0F;        //PE2、PE6推挽输出
        GPIOE->CRL|=0X03000300;       

    GPIOA->ODR|=1<<9;       //PA9上拉
    GPIOA->ODR|=1<<10;      //PA10上拉
    GPIOB->ODR|=1<<0;       //PB0上拉
    GPIOB->ODR|=1<<1;       //PB1上拉
    GPIOE->ODR|=1<<2;       //PE2上拉
    GPIOE->ODR|=1<<6;       //PE6上拉

       
        TIM1->ARR=arr;                        //设定计数器自动重装值
        TIM1->PSC=psc;                        //预分频器设置

    TIM1->CCMR1|=7<<12;          //CH2 PWM2模式                 
        TIM1->CCMR1|=1<<11;         //CH2预装载使能

    TIM1->CCMR2|=7<<4;          //CH3 PWM2模式                 
        TIM1->CCMR2|=1<<3;                 //CH3预装载使能

    TIM1->CCER|=1<<4;           //OC2 输出使能
    TIM1->CCER|=1<<8;           //OC3 输出使能

    TIM1->CCER|=1<<6;       //OC2N 输出使能      
    TIM1->CCER|=1<<10;      //OC3N 输出使能  

    TIM1->CR1|=0<<4;        //向下计数模式

    TIM1->BDTR|=0X14;       //设置死区时间为2ms
        TIM1->BDTR|=1<<15;           //MOE 主输出使能          

        TIM1->CR1|=0x80;           //ARPE使能
        TIM1->CR1|=0x01;            //使能定时器1   
}

int main(void)
{

        Stm32_Clock_Init(9); //系统时钟设置
        delay_init(72);             //延时初始化
        //uart_init(72,9600);  //串口初始化
        TIM1_PWM_Init(999,71);//不分频。PWM频率=72000/(71+1)=1000Khz
           while(1)
        {
                //TIM1->CCR1=500;
        TIM1->CCR2=250;
        TIM1->CCR3=125;
        //TIM1->CCR4=25;
        }
}





回复 支持 反对

使用道具 举报

  离线 

3

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2016-6-2
在线时间
27 小时
发表于 2016-10-13 14:18:22 | 显示全部楼层
dsadsa 发表于 2016-10-13 11:31
我的照葫芦画瓢,用的STM32F103ZET6,CH2n、CH3N互补PWM无输出

void TIM1_PWM_Init(u16 arr,u16 psc)

已经解决了
回复 支持 反对

使用道具 举报

  离线 

17

主题

109

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
348
金钱
348
注册时间
2016-6-13
在线时间
65 小时
发表于 2016-11-5 13:58:12 | 显示全部楼层
支持一下 不过寄存器版看起来好吃力啊 都是学的库函数版本的
回复 支持 反对

使用道具 举报

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

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-4-22 04:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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