OpenEdv-开源电子网

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

给初学PWM的朋友一点小建议

[复制链接]

35

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
331
金钱
331
注册时间
2016-10-12
在线时间
53 小时
发表于 2017-8-25 10:16:57 | 显示全部楼层 |阅读模式
一、PWM是什么?
      PWM其实就是在一个周期内,高电平的持续时间可以调整的周期信号,有两个参数非常重要:频率和脉宽,频率是周期的倒数,而脉宽,一般会用占空比来表示,也就是高电平时间占周期的比例。
PWM.jpg
二、如何产生PWM
1、最简单粗暴,也是最直观的,用延时函数,这里推荐用硬件延时函数
初始化IO口
while(1)
     {
       置位端口
       延时80ms
       复位端口
       延时20ms
     }
这样就产生了一个周期为100ms,占空比为80%的PWM信号


2、有点技术含量的,使用定时器中断
      初始化一个定时器,产生更新中断,在中断里累加一个变量
      中断服务程序()
     {
        pwm_value++
        if (pwm_value==80) 复位端口
        if(pwm_value==100)
             {
               置位端口;
               pwm_value=0;
             }
      }
这样就产生了一个占空比为80%的PWM信号,具体的周期,要卖定时器设定有并,如果定时器更新周期为1ms,那这个PWM的周期为100ms


3、真正的高大上,定时器产的比较功能,产生PWM信号
其它它的原理和上述第2种相拟,给定一个值,如果定时器的计数比这个值小,就输出高电平(这是可调的),如果大于这个值,就输出低电平(可调),只是说,上述是在中断里,靠CPU来控制,而定时器比较,就用的是硬件自己来控制,设定好以后,就完全不要CPU来参与。
部分代码如下:
void TIME_Configuration(void)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
        TIM_OCInitTypeDef TIM_OCInitTypeDefStructure;
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
       
        TIM_TimeBaseInitStructure.TIM_Period = 100-1;
        TIM_TimeBaseInitStructure.TIM_Prescaler=840-1;
        TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
        TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);
        TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);
        TIM_Cmd(TIM4,ENABLE);
       
       
        TIM_OCInitTypeDefStructure.TIM_OCMode=TIM_OCMode_PWM1;
        TIM_OCInitTypeDefStructure.TIM_OutputState=TIM_OutputState_Enable;
        TIM_OCInitTypeDefStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
        TIM_OC1Init(TIM14,&TIM_OCInitTypeDefStructure);
       
        TIM_Cmd(TIM14,ENABLE);
       
}
int main(void)
{
        TIME_Configuration();
        while(1)
        {
                TIM_SetCompare1(TIM14,20);
        }
}


上述代码,产生的PWM的频率=主时钟/重载数/定时器分频,所以,频率为:84M/840/100=1000
占空比为:比较数/重载数,上述代码为:20/100=20%

仅供大家参考,如有错误,敬请原谅!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

82

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2017-11-4
在线时间
88 小时
发表于 2017-12-24 17:17:26 | 显示全部楼层
楼主你好,请问使用你的第一种思路可以输出50KHZ到100KHZ的5V方波吗?延时5us到10us,然后让IO口开漏输出,加一个上拉电阻到5V。
回复 支持 反对

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4036
金钱
4036
注册时间
2015-11-14
在线时间
545 小时
发表于 2017-12-24 19:50:16 | 显示全部楼层
天人一口12 发表于 2017-12-24 17:17
楼主你好,请问使用你的第一种思路可以输出50KHZ到100KHZ的5V方波吗?延时5us到10us,然后让IO口开漏输出, ...

一个硬件定时器可以模拟高分辨率和高频率的PWM
回复 支持 反对

使用道具 举报

8

主题

82

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2017-11-4
在线时间
88 小时
发表于 2017-12-25 09:27:26 | 显示全部楼层
Electronic 发表于 2017-12-24 19:50
一个硬件定时器可以模拟高分辨率和高频率的PWM

什么意思?也就是说我的那个想法有可行性?
回复 支持 反对

使用道具 举报

35

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
331
金钱
331
注册时间
2016-10-12
在线时间
53 小时
 楼主| 发表于 2017-12-28 13:59:30 | 显示全部楼层
天人一口12 发表于 2017-12-24 17:17
楼主你好,请问使用你的第一种思路可以输出50KHZ到100KHZ的5V方波吗?延时5us到10us,然后让IO口开漏输出, ...

可以的,硬件延时可以精确到1us,所以,用第1种思路,是可以生成这样的波的。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 05:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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