OpenEdv-开源电子网

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

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

  [复制链接]

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3223
金钱
3223
注册时间
2015-7-26
在线时间
811 小时
发表于 2015-11-13 23:39:50 | 显示全部楼层 |阅读模式
本帖最后由 it_do_just 于 2020-1-15 16:08 编辑

<p class="MsoNormal">
        <span style="color:#E53333;font-size:16px;"><strong>实战:PWM</strong></span>
</p>
<p class="MsoNormal">
        <span style="font-size:16px;"> </span>
</p>
<p class="MsoNormal">
        <span style="font-size:16px;">一直跟着原子哥的教程一直学到PWM这一章发现一头雾水,自己也没发过什么分享帖,感觉原子哥对PWM这章讲的比较少(mini板教程),后面自己上网找了些资料,网上关于PWM讲的也不多,所以学起来也挺困难的,一直对TIM1有7路PWM不理解,自己只能输出4路,另外三路也不知道怎么输出,通过网上少量资料和自己研究发现这三路用于互补输出,互补输出调试出来了发现又有死区时间,主要用于电机的H桥方面的控制,后面附上自己对高级定时器互补输出和死区时间设置的代码和详解。花了两小时整理了下资料,初学者难免有错希望指出,也希望对跟我一样的初学者学习PWM有点帮助</span>
</p>
<p class="MsoNormal">
        <span style="font-size:16px;"> </span>
</p>
<p class="MsoNormal">
        <span style="font-size:16px;">先简单了解下PWM和死区时间</span>
</p>
<p class="MsoNormal">
        <span style="color:#E53333;font-size:16px;"><strong>简介:</strong></span>
</p>
<p class="MsoNormal">
        <span style="font-size:16px;">脉冲宽度调制(PWM),是英文“
Pulse Width Modulation” 的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制,高级定时器 TIM1 和
TIM8 可以同时产生多达 7 路的
PWM 输出。而通用定时器也能同时产生多达 4路的
PWM 输出,这样,
STM32 最多可以同时产生 30 路 PWM 输出!</span>
</p>
<p class="MsoNormal">
        <span style="font-size:16px;"> </span>
</p>
<p class="MsoNormal">
        <span style="color:#E53333;font-size:16px;"><strong>PWM的死区时间:</strong></span>
</p>
<span style="color:#000000;"><span style="font-size:16px;">死区</span><span style="font-size:16px;">,</span><span style="font-size:16px;">简单解释</span><span style="font-size:16px;">:</span><span style="font-size:16px;">通常</span><span style="font-size:16px;">,</span><span style="font-size:16px;">大功率电机、变频器等,末端都是由大功率管、</span><span style="font-size:16px;">IGBT</span><span style="font-size:16px;">等元件组成的</span><span style="font-size:16px;">H</span><span style="font-size:16px;">桥或</span><span style="font-size:16px;">3</span><span style="font-size:16px;">相桥。每个桥的上半桥和下半桥是是绝对不能同时导通的,但高速的</span><span style="font-size:16px;">PWM</span><span style="font-size:16px;">驱动信号在达到功率元件的控制极时,往往会由于各种各样的原因产生延迟的效果,造成某个半桥元件在应该关断时没有关断,造成功率元件烧毁。死区就是在上半桥关断后,延迟一段时间再打开下半桥或在下半桥关断后,延迟一段时间再打开上半桥,从而避免功率元件烧毁。这段延迟时间就是死区。(就是上、下半桥的元件都是关断的)死区时间控制在通常的低端单片机所配备的</span><span style="font-size:16px;">PWM</span><span style="font-size:16px;">中是没有的。</span><br>
<span style="font-size:16px;"> PWM的上下桥臂的三极管是不能同时导通的。如果同时导通就会是电源两端短路。所以,两路触发信号要在一段时间内都是使三极管断开的。这个区域就叫做“死区”优点就不用说了。缺点是使谐波的含量有所增加。<br>
<br>
<strong><span style="color:#E53333;">7路PWM:<br>

<br>

<br>
代码和详解:
  1. //TIM1_CH1 PWM输出初始化
  2. //arr:自动重装值
  3. //psc:时钟预分频数
  4. void TIM1_PWM_Init(u16 arr,u16 psc)
  5. {       
  6.         RCC->APB2ENR|=1<<11; //TIM1时钟使能
  7.         RCC->APB2ENR|=1<<2; //使能PORTA时钟       
  8.         RCC->APB2ENR|=1<<3; //使能PORTB时钟       
  9.         RCC->APB2ENR|=1<<0; //开启复用时钟       
  10.         GPIOA->CRH&=0XFFFF0000;        //PA8,9,10,11清除之前的设置
  11.         GPIOA->CRH|=0X0000BBBB;        //PA8,9,10,11复用功能输出
  12.         GPIOB->CRH&=0X000FFFFF; //PB13,14,15清除之前的设置
  13.         GPIOB->CRH|=0XBBB00000; //PB13,14,15复用功能输出
  14.         GPIOB->ODR|=1<<13; //PB13 输出上拉,低电平有效
  15.         GPIOB->ODR|=1<<14; //PB14
  16.         GPIOB->ODR|=1<<15; //PB15
  17.         GPIOA->ODR|=1<<8; //PA8
  18.         GPIOA->ODR|=1<<9; //PA9
  19.         GPIOA->ODR|=1<<10; //PA10
  20.         TIM1->ARR=arr;        //设定计数器自动重装值 ①1
  21.         TIM1->PSC=psc;        //预分频器设置 ②2
  22.         TIM1->CCER|=1<<0; //TIM1CH1 输出使能,高电平有效 ③3
  23.         TIM1->CCER|=1<<4; //TIM1CH2 输出使能
  24.         TIM1->CCER|=1<<8; //TIM1CH3 输出使能
  25.         TIM1->CCER|=1<<12; //TIM1CH4 输出使能
  26.         TIM1->CCER|=1<<2; //TIM1CH1N 互补输出使能
  27.         TIM1->CCER|=1<<6; //TIM1CH2N 互补输出使能
  28.         TIM1->CCER|=1<<10; //TIM1CH3N 互补输出使能
  29.         TIM1->CCMR1|=7<<4; //CH1 PWM2模式        ④4
  30.         TIM1->CCMR1|=1<<3; //CH1预装载使能       
  31.         TIM1->CCMR1|=7<<12; //CH2 PWM2模式       
  32.         TIM1->CCMR1|=1<<11; //CH2预装载使能       
  33.         TIM1->CCMR2|=7<<4; //CH3 PWM2模式       
  34.         TIM1->CCMR2|=1<<3; //CH3预装载使能       
  35.         TIM1->CCMR2|=7<<12; //CH4 PWM2模式       
  36.         TIM1->CCMR2|=1<<11; //CH4预装载使能       
  37.         TIM1->BDTR|=0x14; //死区时间设置 ⑤5
  38.         TIM1->BDTR|=1<<15; //MOE 主输出使能 ⑥6
  39.         TIM1->CR1 |= 0x80; //ARPE使能,开始所有输出通道,默认向上计数 ⑦7
  40.         TIM1->CR1 |= 0x01; //使能计数器
  41. }

  42. int main(void)
  43. {
  44.         Stm32_Clock_Init(9); //系统时钟设置
  45.         delay_init(72);        //延时初始化
  46.         TIM1_PWM_Init(499,7199); // 72M/7200=10khz, 1/10khz * 500=50ms ⑧8
  47.         while(1)
  48.         {
  49.                 TIM1->CCR1=250; //占空比:50% 低电平时长25ms ⑨9
  50.                 TIM1->CCR2=125; //占空比:75% 低电平时长12.5ms
  51.                 TIM1->CCR3=50;        //占空比:90% 低电平时长5ms
  52.                 TIM1->CCR4=25;        //占空比:95%        低电平时长2.5ms       
  53.         }
  54. }
复制代码


<br><p class="MsoNormal">
        <span style="color:#E53333;font-size:16px;"><strong>①</strong></span><span style="font-size:16px;color:#E53333;">自动重载</span><span style="font-size:16px;color:#E53333;">,</span><span style="font-size:16px;color:#E53333;">这里重载值为</span><span style="font-size:16px;color:#E53333;">500,50ms</span><span style="font-size:16px;color:#E53333;">一个周期</span>
</p>
<p class="MsoNormal">
        <span style="color:#E53333;font-size:16px;"><strong>②</strong></span><span style="font-size:16px;color:#E53333;">预分频</span><span style="font-size:16px;color:#E53333;">:7200</span><span style="font-size:16px;color:#E53333;">分频</span><span style="font-size:16px;color:#E53333;">,</span><span style="font-size:16px;color:#E53333;">频率为</span><span style="font-size:16px;color:#E53333;">10KHZ</span>
</p>
<span style="color:#E53333;font-size:16px;"><strong>③</strong></span><span style="font-size:16px;"><strong></strong></span><br>

<br>

<br>
<br>
<p class="MsoNormal">
        <span style="font-size:16px;color:#E53333;">TIM1->CCER|=1<<0;//</span><span style="font-size:16px;color:#E53333;">位</span><span style="font-size:16px;color:#E53333;">0</span><span style="font-size:16px;color:#E53333;">为使能位,位</span><span style="font-size:16px;color:#E53333;">1~3</span><span style="font-size:16px;color:#E53333;">都默认为</span><span style="font-size:16px;color:#E53333;">0</span><span style="font-size:16px;color:#E53333;">,即高电平有效,关闭输入捕获,互补输出极性为“高电平有效</span><span style="font-size:16px;color:#E53333;">”</span><span style="font-size:16px;color:#E53333;">,所谓的</span><span style="font-size:16px;color:#E53333;">”</span><span style="font-size:16px;color:#E53333;">有效</span><span style="font-size:16px;color:#E53333;">”</span><span style="font-size:16px;color:#E53333;">跟④有关,如下</span><span style="line-height:1.5;font-size:16px;color:#E53333;"></span>
</p>
<p class="MsoNormal">
        <span style="color:#E53333;font-size:16px;"><strong>④</strong></span>
</p>

<br>
<span style="font-size:16px;color:#E53333;"></span><span style="line-height:1.5;font-size:16px;color:#E53333;">CCMR1</span><span style="line-height:1.5;font-size:16px;color:#E53333;">的</span><span style="line-height:1.5;font-size:16px;color:#E53333;">4~6</span><span style="line-height:1.5;font-size:16px;color:#E53333;">位为模式设置,</span><span style="line-height:1.5;font-size:16px;color:#E53333;">,</span><span style="line-height:1.5;font-size:16px;color:#E53333;">由于我们上面设置为高电平“有效”,这里又设置为</span><span style="line-height:1.5;font-size:16px;color:#E53333;">PWM2</span><span style="line-height:1.5;font-size:16px;color:#E53333;">模式,在⑦没有设置</span><span style="line-height:1.5;font-size:16px;color:#E53333;">TIM1_CR1</span><span style="line-height:1.5;font-size:16px;color:#E53333;">的</span><span style="line-height:1.5;font-size:16px;color:#E53333;">DIR</span><span style="line-height:1.5;font-size:16px;color:#E53333;">位,所以默认为</span><span style="line-height:1.5;font-size:16px;color:#E53333;">0</span><span style="line-height:1.5;font-size:16px;color:#E53333;">,也就是向上计数</span><span style="line-height:1.5;font-size:16px;color:#E53333;">,</span><span style="line-height:1.5;font-size:16px;color:#E53333;">如下</span>
<p class="MsoNormal">
        <span></span>
</p>

<br>
<span style="font-size:16px;color:#E53333;"></span><span style="line-height:1.5;font-size:16px;color:#E53333;">可以推出TIMx_CNT从0开始往上计数,在小于CCR1(第⑨有设置)时会输出无效电平也就是低电平,当大于的时候输出有效电平也就是高电平,这样就达到了设置占空比的目的。一开始我们设ARR为500,CCR1为250,所以一开始输出低电平占50%,高电平也是50%</span>
<p class="MsoNormal">
        <span style="font-size:16px;"> </span>
</p>
<p class="MsoNormal">
        <span style="color:#E53333;font-size:16px;"><strong>⑤</strong>死区时间设置</span><span style="color:#E53333;font-size:16px;">TIM1_BDTR(</span><span style="color:#E53333;font-size:16px;">位</span><span style="color:#E53333;font-size:16px;">7:0)</span><span style="color:#E53333;font-size:16px;">,我们上面设置的是</span><span style="color:#E53333;font-size:16px;">0x14</span>
</p>
<p class="MsoNormal">
        <span style="font-size:16px;color:#E53333;">DT表示死区持续时间,Tdts为系统时钟周期,Tdtg表示乘以倍数后死区设置时间步进值。</span>
</p>

<br>
<span style="font-size:16px;color:#E53333;"></span><span style="line-height:1.5;font-size:16px;color:#E53333;"><span style="color:#E53333;font-family:Simsun;font-size:16px;line-height:normal;">TIM1_BDTR = </span><span style="background-color:;"></span>0x14是高3位为000,也就是调用以下这个公式(第一个公式),高3位可以根据自己需要设置</span><br>
<span style="font-size:16px;"></span>

<br>
<span style="font-size:16px;color:#E53333;"></span><span style="font-size:16px;color:#E53333;">可以看到第⑧可以得知Tdts = 10Khz,Tdtg = Tdts = 10Khz,DT =
20(0x14) * 100us(10Khz) = 2000us = 2ms,也就是死区持续时间为2ms,最后配置输出使能<strong>⑥</strong></span><span style="font-size:16px;color:#E53333;"><strong></strong></span><br>

<br>
<br>
<p class="MsoNormal">
        <span style="color:#E53333;font-size:16px;"><strong>下面是输出的波形</strong><br>

<br>
</span>
</p>
<span style="color:#E53333;font-size:16px;"><br>
<strong>通道1(低电平27ms,高电平23ms)</strong><br>
<strong> 互补输出的通道(CH1N)</strong><span style="color:#E53333;font-size:16px;line-height:24px;"><strong>(高电平23ms,低电平27ms)</strong></span></span><br>

<br>
<br>
<span style="font-size:16px;color:#E53333;"></span><span style="line-height:1.5;font-size:16px;color:#E53333;"><strong>通道</strong></span><span style="line-height:1.5;font-size:16px;color:#E53333;"><strong>2(7ms)</strong></span><br>

<br>
<br>
<p class="MsoNormal">
        <span style="font-size:16px;color:#E53333;"><strong>通道</strong></span><span style="font-size:16px;color:#E53333;"><strong>3(14.5ms)</strong></span>
</p>

<br>
<p class="MsoNormal">
        <span style="font-size:16px;color:#E53333;"><strong>通道</strong></span><span style="font-size:16px;color:#E53333;"><strong>4(2.5ms)</strong></span>
</p>


<p class="MsoNormal">
        <span style="font-size:16px;color:#E53333;"><strong>死区时间</strong></span><span style="font-size:16px;color:#E53333;"><strong>(2ms)</strong></span>
</p>

<br>
<p class="MsoNormal">
        <span style="font-size:16px;color:#E53333;">由于互补输出且有死区时间所以</span><span style="font-size:16px;color:#E53333;">CH1</span><span style="font-size:16px;color:#E53333;">加了</span><span style="font-size:16px;color:#E53333;">2ms</span><span style="font-size:16px;color:#E53333;">,而</span><span style="font-size:16px;color:#E53333;">CH1N</span><span style="font-size:16px;color:#E53333;">减了</span><span style="font-size:16px;color:#E53333;">2ms</span><span style="font-size:16px;color:#E53333;">,死区时间跟计算的一样是</span><span style="font-size:16px;color:#E53333;">2ms,</span><span style="font-size:16px;color:#E53333;">而最后一个</span><span style="font-size:16px;color:#E53333;">CH4</span><span style="font-size:16px;color:#E53333;">没有互补</span><span></span>
</p>
<p class="MsoNormal">
        <span style="font-size:16px;color:#E53333;">输出所以自然是</span><span style="font-size:16px;color:#E53333;">2.5ms</span><span style="font-size:16px;color:#E53333;">不变,由于我们设置的</span><span style="font-size:16px;color:#E53333;">10KHZ</span><span style="font-size:16px;color:#E53333;">,而手册是以</span><span style="font-size:16px;color:#E53333;">8M</span><span style="font-size:16px;color:#E53333;">为例子的,大家也可以试一下,亲测没有问题,如果</span><span></span>
</p>
<p class="MsoNormal">
        <span style="font-size:16px;color:#E53333;">是</span><span style="font-size:16px;color:#E53333;">8M</span><span style="font-size:16px;color:#E53333;">死区时间精度也更高可以,可以设为</span><span style="font-size:16px;color:#E53333;">us</span><span style="font-size:16px;color:#E53333;">和</span><span style="font-size:16px;color:#E53333;">ns</span><span style="font-size:16px;color:#E53333;">级别。下面附上这个例程的代码</span><span></span>
</p>

<br>
<br>
<br>
<span></span>
<p>
        <br>
</p></div>

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

979.52 KB, 下载次数: 4322

我的博客:http://blog.csdn.net/itdo_just
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3223
金钱
3223
注册时间
2015-7-26
在线时间
811 小时
 楼主| 发表于 2020-1-15 16:00:17 | 显示全部楼层
帖子本来只是代码乱了,我重新编辑了代码区域然后按保存,结果格式也全乱了。。。。。。希望原子哥解决下排版的问题吧,我之前发的帖子有关代码的部分也全乱了
我的博客:http://blog.csdn.net/itdo_just
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

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

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

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

使用道具 举报

0

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

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

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

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

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

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

使用道具 举报

11

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

11

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

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

使用道具 举报

11

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

18

主题

238

帖子

3

精华

金牌会员

Rank: 6Rank: 6

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

使用道具 举报

8

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

8

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

6

主题

40

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

5

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

9

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
426
金钱
426
注册时间
2011-7-11
在线时间
49 小时
发表于 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

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

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3223
金钱
3223
注册时间
2015-7-26
在线时间
811 小时
 楼主| 发表于 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 | 显示全部楼层
多谢,楼主的分享!学习了,,谢谢,,
回复 支持 反对

使用道具 举报

13

主题

163

帖子

0

精华

金牌会员

Rank: 6Rank: 6

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

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

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

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

使用道具 举报

18

主题

238

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1823
金钱
1823
注册时间
2014-8-5
在线时间
211 小时
发表于 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 | 显示全部楼层
我用的是示波器观察的
回复 支持 反对

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3223
金钱
3223
注册时间
2015-7-26
在线时间
811 小时
 楼主| 发表于 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
你再看看代码吧,我没试过用示波器调试这个代码,理论上是没有问题的

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

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3223
金钱
3223
注册时间
2015-7-26
在线时间
811 小时
 楼主| 发表于 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

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
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 | 显示全部楼层
你好,我想问一下在互补输出的情况下加入刹车功能,那程序设置应该怎么编?在线等,谢谢
回复 支持 反对

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

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

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

使用道具 举报

0

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2015-5-17
在线时间
8 小时
发表于 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

主题

277

帖子

0

精华

高级会员

Rank: 4

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

使用道具 举报

4

主题

38

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

2

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

3

主题

42

帖子

0

精华

高级会员

Rank: 4

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

使用道具 举报

4

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

32

主题

230

帖子

0

精华

高级会员

Rank: 4

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

使用道具 举报

3

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2016-6-2
在线时间
34 小时
发表于 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

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2016-6-2
在线时间
34 小时
发表于 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 | 显示全部楼层
支持一下 不过寄存器版看起来好吃力啊 都是学的库函数版本的
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 07:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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