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);
    }
}
相关推荐
zlinear数据采集卡4 小时前
从0到1硬核拆解:工业级数据采集卡的隔离设计与Modbus通信实战
arm开发·单片机·嵌入式硬件·fpga开发·开源
咖啡星人k7 小时前
从Vibe Coding到Prompt Engineering:AI编程的新技能树
面试·职场和发展·ai编程
FreakStudio10 小时前
WIZnet 开源方案分享:W55MH32 开发板 + 小智 AI实现以太网版本的小智机器人
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
科芯创展10 小时前
XZ61N,N-channel open drain输出电压检测芯片
单片机·嵌入式硬件
学iOS很快乐11 小时前
Pinterest Staff SDE 五轮面试全过,加拿大 TC 500K CAD,附 OA 真题和每轮考点
面试·职场和发展
Purple Coder14 小时前
基于电机控制的MatlabSenier模型
职场和发展
迷茫、Peanut14 小时前
51调时钟(2)
单片机
吠品15 小时前
Python字典键获取的四种实用方法
stm32·单片机·嵌入式硬件
ye1501277745515 小时前
220V转12V|18V1A非隔离电源芯片WT5110
单片机·嵌入式硬件·其他·硬件工程