2025蓝桥杯(单片机)备赛--扩展外设之PWM的原理与应用(十三)

1 PWM原理

PWM :该方法未使用常规的PWM相关的寄存器配置;而是使用了定时器2;

与这个类似。

周期: 通过定时器2设置每次进中断的间隔,来设置最小周期(步进),如设置100us,这时PWM 的最小周期为100us,最大频率为1/100us;可通过设置一个变量进行累加,当该变量的 值达到一定的值的时候,进行PWM调节,以此来达到进一步周期的设置; 当变量达到预期值的时候,可以通过置0的方式,来重新计数,但经研究发现, 可以通过取余来达到此目的,例如cnt_pwm%=10,则cnt_pwm的最大值为10 cnt_pwm%=101,则cnt_pwm的最大值为100,达到了目的; 如果设置为cnt_pwm=cnt_pwm%10+1;并假设定时器2进入中断间隔为100us,则PWM 的周期为100us*10=1ms;

占空比:占空比即是高电平的时间/周期,此处可以用if语句进行值的比较; 当计数器的值小于预期的高电平的时间的时候,设置为1, 当计数器的值大于预期高电平的时间时,设置为0; 如设置pwm_duty=8,则占空比依据上面设置的1ms,可得占空比为80%; 为了更好更简洁的计算,可设置pwm_duty=80再/10,这样便于占空比的调整 可以通过按键设置占空比, 例如 pwm_duty=(pwm_duty+10)%110; 此时占空比步进为10,最大值为109, 但因为刚才pwm_duty/10的缘故,最大值为10,这样设置可以进行0.1ms-10ms,0.1ms步进的高电平时间

定时器设置:设置为 12MHZ,定时器2,100us,1T(ISP生成) 记得加上中断开启,ISP生成的函数不带中断 (IE2|=0X04;EA=1;

2 PWM实现代码

最小周期设置:利用定时器 2进行设置:

12MHZ,1T,定时器2,

//第一位是1,不是0,低四位,8-4-2-1

cpp 复制代码
void Timer2_Init(void)        //100微秒@12.000MHz
{
    AUXR |= 0x04;    //定时器时钟1T模式
    T2L = 0x50;    //设置定时初始值
    T2H = 0xFB;    //设置定时初始值
    AUXR |= 0x10;    //定时器2开始计时
        //加上中断
        IE2|=0X04;  //8421 8421 
        EA=1;
}

PWM产生:设置一个CCR的值(占空比),在设置一个CNT用来计数

cpp 复制代码
u8 pwm_ccr=80;
void PWM_Process(void)
{
    pwm_cnt=(pwm_cnt+1)%10;
    if(pwm_cnt<(pwm_ccr/10))
    {
        Device_Ctrl(0x80,0x00);
    }
    else
    {
        Device_Ctrl(0x80,0xff);
    }
}
相关推荐
天空'之城1 小时前
单片机基础核心知识点汇总(三十三)
数据库·单片机·嵌入式硬件
后台模板学习2 小时前
2026最新面试真题:到达用英语怎么说背后的逻辑与源码剖析
面试·职场和发展·php
CoderYanger3 小时前
前端基础——JavaScript(WebAPI)(下篇)
java·开发语言·前端·javascript·程序人生·面试·职场和发展
单片机仿真设计4 小时前
基于 STM32 的家庭环境监测与火灾报警灭火系统(Proteus 仿真)
stm32·单片机·嵌入式硬件·proteus·毕设
辰域电子5 小时前
STM32项目开源:智能万年历/智能闹钟设计(代码+原理图+仿真)
stm32·单片机·嵌入式硬件·开源·proteus
敲代码的嘎仔5 小时前
自己设计了一个兑换码算法:自增ID + Base32转码 + 按位加权签名 + 异或混淆,面试被追问细节时终于不用慌了
java·数据库·mysql·算法·微服务·面试·职场和发展
一条破秋裤5 小时前
STM32F103 RCC 第一层复习:时钟树、外设时钟与重复测试
stm32·单片机·嵌入式硬件
smartpi_ai7 小时前
原理图上的 1.2V 是输入还是输出?蜂鸟 M 裸芯供电架构、CORE 滤波设计与外围器件三规矩
单片机·嵌入式硬件·架构
一条破秋裤8 小时前
STM32 单片机两层学习规划
stm32·单片机·学习
aqiu1111118 小时前
【数位 DP / 记忆化搜索】蓝桥云课 - 光轨区的 AI 数 题解
c++·算法·蓝桥杯·数位dp