标题: 请教大家,51单片机10us中断一次,能来得及执行其它程序吗 [打印本页]

作者: rebios    时间: 2024-3-27 10:01
标题: 请教大家,51单片机10us中断一次,能来得及执行其它程序吗
C51单片机,晶振用12M

void init()     //初始化函数
{
        TMOD=0X01;  //工作模式选择
        TH0=(65535-10)/256;   //高位装载初始值
        TL0=(65535-10)%256;   //低位装载初始值
        EA=1;                 //开总中断
        ET0=1;                //开定时器0中断
        TR0=1;                                 //启动定时器0



作者: rebios    时间: 2024-3-27 10:28
我做了个PWM控制LED的亮度,想让灯慢慢亮下来
作者: xiaobendan001    时间: 2024-3-27 10:29
12M,12T,10US?应该干不了啥了吧,主频提到22M,改为1T,兴许还能干点
作者: xiaobendan001    时间: 2024-3-27 10:45
rebios 发表于 2024-3-27 10:28
我做了个PWM控制LED的亮度,想让灯慢慢亮下来

硬件PWM还是软件的?频率不需要那么高啊
作者: wulin    时间: 2024-3-27 11:09
PWM占空比0-100,100-200us中断就行,10us中断基本玩不转。
作者: 明日之星8    时间: 2024-3-27 12:33
那就要看你的程序怎么写了,你想玩PWM放着高级定时器不用非要用T0完成
PWM的任务。T0只能软件模拟,这样要花费很多的CPU的时间,而且最窄
脉冲做不到1个时钟。
如果用高级定时器来做那就不同了,10uS就是120个时钟,CPU只需要在“更新”
中断里写一下下个周期的脉宽值就好了,120个时钟里面还有大部分的时间CPU
还可以做其它的任务。
作者: Y_G_G    时间: 2024-3-27 12:43
10uS一次中断,如果中断执行时间再有个10uS的话,效率就慢一半了,影响很大的,它不是说做不了什么事,而是慢,而且是慢到“一卡一卡”的那种情况
比如你按键按一下就开灯,10uS中断可能就是按下按键之后,好几秒才能开灯的那种
如果是要用到PWM,可以用片上的PWM
实在没有或者是非得用定时器不可的话,可以把灯的频率调到200HZ,感觉上有一点点闪频,但也能接受
定时器PWM只做10级的占空比调节,那就可以了
作者: fosu顽童    时间: 2024-3-27 13:46
Y_G_G 发表于 2024-3-27 12:43
10uS一次中断,如果中断执行时间再有个10uS的话,效率就慢一半了,影响很大的,它不是说做不了什么事,而是 ...

我最近一次项目也遇到过这个情况:电机驱动芯片建议10K以上的PWM频率,10KHZ对应是100us的PWM周期,然后在调试电机功能时发现调速有卡顿。后面排查问题就定位到是主程序跟中断服务程序有冲突导致的异常。

当初做MCU选型的时候没考虑到这一点,所以没选带有PWM功能的型号,嗐。
吃一堑长一智,下一批次就准备用STC8H系列来调试。
作者: coody_sz    时间: 2024-3-27 21:59
可以执行几个us的程序。
作者: 祥子陈    时间: 2024-3-27 23:08
10u的话,完全没有问题,不过你要是玩pwm,10u周期,100可调,这1ms了,相当于1k的频率.这种pwm使用有限吧,最好用硬件pwm,现在基本都有,寄存器一设置,自动发指定频率,指定占空比,方便的一批
作者: 1600277881    时间: 2024-3-28 00:04
10us 中断间隔是否可行,取决于你的中断程序,你不贴中断程式只贴初始化的代码是啥意思?

作者: TTQ001    时间: 2024-3-28 06:26
这取决于其他任务是否严重依赖于时间。
作者: rebios    时间: 2024-3-29 09:58
谢谢楼上各位的回复
采用的是STC15W104,没有硬件PWM,用软件来模拟,我试了,灯可以慢慢亮下来或暗下来

void  Time0() interrupt 1 //中断函数
{
        TH0=(65536-10)/256;   //装载初值
        TL0=(65536-10)%256;   //装载初值
        num++;                //10us中断一次 num 加1
        if(num==100)          //判断num 值  是否等于100 如果等于100 说明1ms时间到 也就相当于定时为1KHZ频率
        {
                num=0;            //将num值清零
        }
        pwm_print();           //调用PWM函数
        pwm_print1();           //调用PWM函数
}
作者: rebios    时间: 2024-3-29 10:10
祥子陈 发表于 2024-3-27 23:08
10u的话,完全没有问题,不过你要是玩pwm,10u周期,100可调,这1ms了,相当于1k的频率.这种pwm使用有限吧,最好用 ...

谢谢
程序就是这样设计的,10us周期,100可调,工作频率1K,依靠延时程序,灯能一级一级亮下来。
但是有个问题,LED的亮度是非线性,一开始亮度变化特别大,后来就基本感觉不出来了。
作者: rebios    时间: 2024-3-29 10:16
感谢各位,程序就是拷贝自本坛的。
程序可以正常运行,后来我嫌100级调光,档位还是太少,改成1000级调光,芯片用STC15W104,控制BP2838 LED电源。晶体还是12M默认。仍能正常工作,程序改成下面这样。
我现在鱼缸就正在用这个灯照明,每天从不亮到最亮,将近要一个小时,模拟自然光。

void  Time0() interrupt 1 //中断函数
{
        TH0=(65536-1)/256;   //装载初值
        TL0=(65536-1)%256;   //装载初值
        num++;                //1us中断一次 num 加1
        if(num==1000)          //1KHZ频率
        {
                num=0;            //将num值清零
        }
        pwm_print();           //调用PWM函数
        pwm_print1();           //调用PWM函数
}
作者: zgrfox110    时间: 2024-3-29 10:36
灯慢慢亮下来?眼睛看?需要那么快的频率?1毫秒调一次,眼睛能分辨出来?你知道变得很快和看出来变不一样。能看出来就行,那么快有啥用?
作者: 1600277881    时间: 2024-3-29 20:41
以你贴出来的中断程序,估计CPU是12T, 加上这种写法10us肯定是不够的,不用想了





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1