找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 749|回复: 7
打印 上一主题 下一主题
收起左侧

STC15Fxx系列单片机硬件PWM利用定时器2溢出脉冲作为计数器计数脉冲问题?

[复制链接]
跳转到指定楼层
楼主
ID:232366 发表于 2023-3-26 10:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是一个STC15单片机的硬件输出PWM程序其硬件PWM的计数脉冲我设置的是使用定时器2的中断溢出脉冲作为计数脉冲
自己琢磨了好久目前功能是实现了但是计算来计算去都搞清楚  最终的PWM频率是怎么来的目前输出频率是20HZ逻辑分析
仪测试出来的想问问论坛有经验的老铁帮忙解答一下?

#define CYCLE   0x1f4L                //定义PWM周期(最大值为32767)
#define DUTY    50L                        //定义占空比为50%


/*---------------------------------------------------------------------*/
/*STC15Fxx 系列 单片机硬件PWM利用定时器2溢出脉冲作为计数器计数脉冲实例 */
/*--------工作频率为12MHz-----------------------------*/

void Timer2Init(void)        //100微秒@12.000MHz"中断周期为200us"
{
        AUXR&=0xFB;                //定时器时钟12T模式
        T2L = 0x9C;                //设置定时初始值
        T2H = 0xFF;                //设置定时初始值
        AUXR|=0x10;                //定时器2开始计时
        IE2&=0xFB;                //允许定时器2申请中断
        IE2|=0x04;                //允许定时器2申请中断
        EA=1;                        //允许所有的中断源申请中断
}

void PWM_INIT()//STC15Fxx 系列 输出任意周期和任意占空比的PWM初始化函数
{
        P_SW2|=0x80;//置1"EAXSFR"允许访问RAM随机存储器区的特殊功能寄存器
        PWMCFG=0x00;//(置0"CBTADC位不使能ADC转换")(置0"C2INI使能PWM2端口初始化电平为0")
        PWMCR=0x01;//置0"ENPWM"(先关闭不启动计时总控位)        "置1"ENC20"(使能PWM2通道口为PWM输出受波形发生器控制)"
        PWMC=CYCLE;//设置PWM周期
        PWMCKS|=0x10;//(置"1" "SELT2")时钟来源定时器T2的溢出脉冲 其他位保持不变
        //占空比为(PWM2T2-PWM2T1)/PWMC
        PWM2T1=0x0000;//设置PWM2第1次反转的PWM计数
        PWM2T2=CYCLE*DUTY/100;//设置PWM2第2次反转的PWM计数
        PWM2CR&=0xF7;//选择PWM2输出到P2.7,其他功能不使能
        PWM2CR|=0x08;//选择PWM2输出到P2.7,其他功能不使能
        PWMCR|=0x80;//最后使能"ENPWM"总控位使内部计数器开始计数(必须全部特殊功能寄存器设置完毕后才可以使能此位)
        P_SW2&=~0x80;//置0"EAXSFR"禁止访问RAM随机存储器区的特殊功能寄存器
}

void Timer2_Interrupt_Service(void) interrupt 12
{
        P30=~P30;
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1034262 发表于 2023-3-26 11:57 | 只看该作者
用Timer2做PWM时钟不要开中断。
回复

使用道具 举报

板凳
ID:232366 发表于 2023-3-26 13:37 来自手机 | 只看该作者
coody_sz 发表于 2023-3-26 11:57
用Timer2做PWM时钟不要开中断。

已经关了  开了貌似也不影响  就是为了调试用。主要的问题是比如我要调频率时应该怎么调?使用定时器溢出脉冲作为计数脉冲怎么映射到PWM的过程到最后得出的频率计算的过程是啥样的?
回复

使用道具 举报

地板
ID:161164 发表于 2023-4-1 10:53 | 只看该作者
频率=1/(中断时间*PWM周期)
以你的代码作例子
频率=1/(100微秒 * CYCLE) = 1/(100微秒 * 0x1f4) = 1/(50000微秒) = 20hz
要调频率,可以改变定时器2中断时间(T2L/T2H)如10us
频率=1/(10微秒 * CYCLE) = 1/(10微秒 * 0x1f4) = 1/(5000微秒) = 200hz
回复

使用道具 举报

5#
ID:232366 发表于 2023-4-2 10:23 | 只看该作者
lkc8210 发表于 2023-4-1 10:53
频率=1/(中断时间*PWM周期)
以你的代码作例子
频率=1/(100微秒 * CYCLE) = 1/(100微秒 * 0x1f4) = 1/(500 ...

感谢老铁耐心回复 我去计算一下过程
回复

使用道具 举报

6#
ID:232366 发表于 2023-4-2 10:55 | 只看该作者
lkc8210 发表于 2023-4-1 10:53
频率=1/(中断时间*PWM周期)
以你的代码作例子
频率=1/(100微秒 * CYCLE) = 1/(100微秒 * 0x1f4) = 1/(500 ...

想问问您式中写道:频率=1/(10微秒 * CYCLE) = 1/(10微秒 * 0x1f4) = 1/(5000微秒) = 200hz
请问CYCLE这个时钟是哪里的的时钟????定时器经过对系统时钟分频后的时钟还是????
首先很感谢您对我的帖子精心回复。请问能不能将上面的式子拆分一下理解 感谢感谢。
回复

使用道具 举报

7#
ID:161164 发表于 2023-4-2 16:10 | 只看该作者
SHANWAZI 发表于 2023-4-2 10:55
想问问您式中写道:频率=1/(10微秒 * CYCLE) = 1/(10微秒 * 0x1f4) = 1/(5000微秒) = 200hz
请问CYCLE这 ...

cycle是计时数
在代码开头处定义了
数值含义是12Mhz 12T: 1 = 1us
12MHz 1T: 1= 1/12 us
24MHz 12T: 1= 12/24 * 1us = 0.5us
回复

使用道具 举报

8#
ID:232366 发表于 2023-4-2 16:39 | 只看该作者
lkc8210 发表于 2023-4-2 16:10
cycle是计时数
在代码开头处定义了
数值含义是12Mhz 12T: 1 = 1us

十分感谢老铁的耐心回复与解答。我先去理解理解!
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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