[范例教程]

定时器做PWM程序

[复制链接]
2173|32
手机看帖
扫描二维码
随时随地手机跟帖
elsaflower|  楼主 | 2023-11-25 14:55 | 显示全部楼层 |阅读模式
#include "STC89.H"                                        //头文件包含
#include <intrins.h>                                //头文件包含
typedef unsigned char u8;                        //重新定义数据类型名
typedef unsigned short u16;                        //重新定义数据类型名
typedef unsigned long u32;                        //重新定义数据类型名
sbit PWM_OUT=P2^1;        
u8 idata PWM_Write_Byte[3]=0;

//****************************祁绪电子 2020年5月***
// 定时器0初始化  晶振11059200,12T,输出50Hz的PWM,占空比0~255
// 定时器初值为:256-(11059200÷12÷50Hz÷256) = 184 = 0xB8
void PWM_Init(void)
{
        TMOD &= 0xF0;                                        //配置定时器工作模式
        TMOD |= 0x02;                                        //配置定时器工作模式 8位自动重装模式
    TL0 = 0xB8;;                    //定时器初值
    TH0 = 0xB8;                                //定时器重装初值
    TR0 = 1;                        //启动定时器0
    ET0=1;                                                         //允许定时器0申请中断
        EA=1;                                                        //中断总闸闭合
}
//****************************祁绪电子 2020年5月***
//定时器0的CPU处理函数,位置任意写都行
void PWM_Display_timer0() interrupt 1
{
        
        static u8 pwm_t=0;                                 //局部变量,不丢失数据
        if(pwm_t<PWM_Write_Byte[0])
        {
                PWM_OUT=1;                                 
        }
        else PWM_OUT=0;
        pwm_t++;
}

//***************************
// PWM 数模变换数据分配
void PWM_Allot()                                          
{
        static u8 kkk=0;        
        static u8 count=0;
        count++;
        if(count>100)
        {
                count=0;
                kkk++;
                PWM_Write_Byte[0]=kkk;        //kkk为占空比自动增加
                PWM_Write_Byte[1]=10;        
                PWM_Write_Byte[2]=10;
        }
}


void main()                                                        //主函数
{
        PWM_Init();
        while(1)                                                //主函数大循环
        {
                PWM_Allot();        
        }
}

使用特权

评论回复
elsaflower|  楼主 | 2024-5-3 17:44 | 显示全部楼层
用于PWM输出的GPIO引脚配置为复用功能,并设置为推挽输出模式,以确保能够提供足够的电流驱动负载。

使用特权

评论回复
deliahouse887| | 2024-5-4 16:06 | 显示全部楼层
有多个定时器或PWM通道需要同步,确保它们的时钟源和触发源一致,以避免同步误差。

使用特权

评论回复
houjiakai| | 2024-5-4 16:14 | 显示全部楼层
如果使用定时器中断来更新PWM信号,确保在中断服务程序中正确地处理定时器的更新和比较事件。避免在中断服务程序中进行耗时操作,以免影响PWM的实时性。

使用特权

评论回复
timfordlare| | 2024-5-5 07:30 | 显示全部楼层
占空比是PWM信号中高电平时间占整个周期时间的比例。确保定时器配置可以精确控制占空比,以满足应用需求。

使用特权

评论回复
geraldbetty| | 2024-5-5 07:42 | 显示全部楼层
使用预分频器来适当调整定时器的运行频率,以生成所需PWM信号的频率。

使用特权

评论回复
albertaabbot| | 2024-5-5 07:55 | 显示全部楼层
一些微控制器可能提供多个定时器模块,每个模块可能有不同的特性,如计数范围、时钟源等。

使用特权

评论回复
pentruman| | 2024-5-5 08:08 | 显示全部楼层
为了获得所需的PWM频率,需要设置定时器的预分频器。预分频器可以将定时器时钟频率降低,从而实现所需的PWM频率。

使用特权

评论回复
averyleigh| | 2024-5-5 08:21 | 显示全部楼层
当在运行中修改PWM参数时,注意某些定时器在更新事件时可能会造成短暂的PWM中断或异常行为。

使用特权

评论回复
sheflynn| | 2024-5-5 08:33 | 显示全部楼层
PWM信号的占空比(高电平时间与周期的比值)决定了输出功率或控制量,需要根据应用需求精确设置。

使用特权

评论回复
mickit| | 2024-5-5 08:45 | 显示全部楼层
如果使用定时器中断来更新PWM占空比,需要确保中断服务程序的执行速度足够快,以免影响PWM信号的准确性。

使用特权

评论回复
biechedan| | 2024-5-6 10:55 | 显示全部楼层
注意微控制器的固件或硬件在PWM生成方面的限制,例如最小和最大PWM频率、同时运行的PWM通道数量等。

使用特权

评论回复
tifmill| | 2024-5-6 14:55 | 显示全部楼层
选择具有PWM输出功能的定时器。某些微控制器中的定时器可能不支持PWM或者支持的通道数量有限。

使用特权

评论回复
sheflynn| | 2024-5-6 15:17 | 显示全部楼层
考虑使用快速PWM模式(如果定时器支持)以获得更高的频率和/或更精细的占空比控制。但是,快速PWM模式可能会牺牲一些占空比调节的精度。

使用特权

评论回复
jackcat| | 2024-5-6 15:56 | 显示全部楼层
某些应用场景中,可能需要设置同步和死区时间。同步可以确保多个PWM信号在同一时刻开始,而死区时间可以防止MOSFET或IGBT等电力开关元件的过电压和过电流现象。

使用特权

评论回复
primojones| | 2024-5-7 10:55 | 显示全部楼层
通过设置比较寄存器的值来控制PWM信号的占空比。比较寄存器的值应根据所需的占空比和计数器上限值进行计算。

使用特权

评论回复
updownq| | 2024-5-7 11:37 | 显示全部楼层
配置定时器中断和事件,以便在定时器溢出时生成PWM脉冲,或者在需要时更改占空比。

使用特权

评论回复
updownq| | 2024-5-7 15:29 | 显示全部楼层
根据需要选择定时器的PWM模式。不同的PWM模式可能提供不同的特性,如死区时间、占空比等。

使用特权

评论回复
sdlls| | 2024-5-7 19:44 | 显示全部楼层
设置PWM波形的占空比,以控制输出脉冲的宽度。这通常通过编程定时器的比较寄存器来实现。

使用特权

评论回复
uytyu| | 2024-5-7 20:04 | 显示全部楼层
电源噪声和时钟抖动可能会影响PWM信号的精度和稳定性。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

1127

帖子

0

粉丝