PWM波理解

        最近做智能家居的小demo,不论是舵机模拟窗帘、电机模拟风扇以及台灯的模拟,都用到了PWM波,后面可能还会试着开发小车啊这些,也会用到PWM波,所以这里记录一下自己的理解。

        什么是PWM波

        脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。

        名词解释

        频率:单位Hz 在pwm中指1s内信号从高电平到低电平又回到高电平的次数

        周期:单位s   频率分之一 

        占空比:是一个脉冲周期内,高电平的时间与整个周期时间的比例,单位: %

        例:周期的时间是10ms,高电平时间是8ms 那么低电平时间就是2ms 总的占空比 8/(8+2)= 80%

        PWM就是脉冲宽度调制 通过调节占空比,就可以调节脉冲宽度(脉宽时间) 而频率 就是单位时间内脉冲信号的次数,频率越大

        在脉冲信号中,占空比是指一个脉冲周期内高电平所占的时间比例。如果一个脉冲信号的频率为20Hz,且占空比为80%,那么这意味着在一个脉冲周期内,高电平的时间为0.8倍的周期时间,而低电平的时间为0.2倍的周期时间。

        假设一个脉冲信号的周期为T,那么它的频率和周期之间的关系可以用以下公式表示:

        频率 = 1 / 周期
        所以,周期T = 1 / 频率

        现在,我们可以用这个公式来计算高电平的时间:

        高电平时间 = 0.8 × 周期T
        = 0.8 × (1 / 频率)
        = 0.8 / 频率

        将频率=20Hz代入上式,得到:

        高电平时间 = 0.8 / 20Hz = 40ms

        因此,对于一个20Hz、占空比为80%的脉冲信号,每次输出的脉冲信号的高电平时间为40ms。这意味着在1秒钟之内,会输出20次这样的脉冲信号。

        PWM原理

        以单片机为例,我们知道,单片机的IO口输出的是数字信号,IO口只能输出高电平和低电平

        假设高电平为5V 低电平则为0V 那么我们要输出不同的模拟电压,就要用到PWM,通过改变IO口输出的方波的占空比从而获得使用数字信号模拟成的模拟电压信号

        比方说 占空比为50% 那就是高电平时间一半,低电平时间一半,在一定的频率下,就可以得到模拟的2.5V输出电压 那么75%的占空比 得到的电压就是3.75V

        及在单片机中改变占空比就可以改变IO口输出的电压大小

        代码:

        这里用的是HT32,stm32也是一样,都是用定时器产生PWM波

        周期 = (计数器重装载值 + 1) / 预分频系数

        根据下面代码的设置

        计数器重装载值 = 200-1 = 199

        预分频系数 = 4800-1 = 4799

        周期 = (199 + 1) / 4799 = 20ms

//产生一个20ms 定时周期 
void GPTM_PWM_init(void)
{
 
    TM_TimeBaseInitTypeDef TimeBaseIniture;   //结构体
    TM_OutputInitTypeDef   OutIniture;
 
    CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
    CKCUClock.Bit.PA         = 1;       //GPIOA时钟打开
    CKCUClock.Bit.AFIO       = 1;       //复用时钟
    CKCUClock.Bit.GPTM0      = 1;
    CKCU_PeripClockConfig(CKCUClock, ENABLE);      //时钟使能
    AFIO_GPxConfig(GPIO_PA, GPIO_PIN_6, AFIO_MODE_4);  //开启复用功能
		GPIO_DirectionConfig(HT_GPIOA,HTGPIO_PIN,GPIO_DIR_OUT);
		TM_ClearFlag(HT_GPTM0, TM_FLAG_UEV);  //清除更新中断标志
    TM_OutputStructInit(&OutIniture);    //填写每个变量的默认值

    //定时器时基以及计数方式初始化

    TimeBaseIniture.CounterMode = TM_CNT_MODE_UP;            //边沿对齐向上模式
    TimeBaseIniture.CounterReload = 200-1;                       //计数重装载计数器
    TimeBaseIniture.Prescaler = 4800 -1;                           //预分频系数
    TimeBaseIniture.PSCReloadTime=TM_PSC_RLD_IMMEDIATE;    //立即重装载
    TM_TimeBaseInit(HT_GPTM0,&TimeBaseIniture);
 


//  2通道输出 PA6
    OutIniture.Channel=TM_CH_2;
    OutIniture.Control=TM_CHCTL_ENABLE;         //GPTM通道使能
    OutIniture.OutputMode=TM_OM_PWM1;          //GPTM 通道 PWM1输出模式  PWM2模式翻转
    OutIniture.Polarity=TM_CHP_INVERTED;    //GPTM 通道极性是低电平或下降沿         
    //OutIniture.Compare=200;                      // 这个是配置占空比的
    TM_OutputModeConfig(HT_GPTM0,TM_CH_2,TM_OM_PWM1);
    TM_OutputInit(HT_GPTM0,&OutIniture);
 

	
    TM_IntConfig(HT_GPTM0, TM_INT_CH0CC|TM_INT_CH1CC|TM_INT_CH2CC|TM_INT_CH3CC, ENABLE);  //中断		
    TM_Cmd(HT_GPTM0,ENABLE);  //使能计数
}

总之,PWM就是在合适的信号频率下,通过一个周期里改变占空比的方式来改变输出的有效电压

  • 22
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值