打印

不用定期器中断PWM用延迟怎么

[复制链接]
417|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangpe|  楼主 | 2022-10-15 09:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
不用定期器中断PWM用延迟怎么

使用特权

评论回复
沙发
zhaoxqi| | 2022-10-15 09:14 | 只看该作者
2个计数单元 一个控制高,一个控制低,根据数值来延时,当pwm升高时,高计数加,低计数减,以保证周期不变则可

使用特权

评论回复
板凳
yszong| | 2022-10-15 09:17 | 只看该作者

unsigned char i;
while(1)
{
         P1^1 = 1;
         delay(i);
         P1^1 = 0;
         delay(256 - i );
}                 高电平占空比 = i/256,频率 = 1/delay(1)*256
这是八位的PWM,16位的就把i定义为unsigned int , 把delay(256-i)改成65536-i就可以了。

使用特权

评论回复
地板
wangpe|  楼主 | 2022-10-15 19:01 | 只看该作者
我编程实验看下。。谢谢楼上。。

使用特权

评论回复
5
llljh| | 2022-10-15 19:08 | 只看该作者
呵呵  俺不习惯这样写的  不过这是可行的

使用特权

评论回复
6
wangpe|  楼主 | 2022-10-15 19:10 | 只看该作者

void pwm()
       {
           uchar i;
           for(i=1;i<=5;i++)
           {
           if(i<=PWM_ON)
                    pwm1=1;         
          if(i>PWM_ON)
           pwm1=0;
           delayus(100);
           }
            }
这是刚写的,灯是变暗了,可是再调节可以变亮,但最暗的就是那样。。请教高手。。

使用特权

评论回复
7
wuhany| | 2022-10-15 19:14 | 只看该作者
void pwm(uchar percent){//占空比

    uchar i,t;

    t=1;//延时倍数

    for(i=0; i<100*t; i++){

         if(i<percent)

              pwm1=1;

         else

              pwm1=0;

   }

}        

         

void main(){

         while(1){

            pwm(20);//占空比20%

         }

}  





}

使用特权

评论回复
8
juventus9554| | 2022-10-15 19:18 | 只看该作者

static uchar PerCnt=0;

void PWM(uchar Percent)
{        
         if(PerCnt++>=100U)
         {
                 PerCnt=0;
                 if(Percent)
                 PwmOut=1;
         }
         if(MotorTime>=Percent)
                 PwmOut=0;        
}

该方法的好处是不用延时等待,节约CPU资源
可以放于中断或一定的时基调用一次,便于控制频率。

使用特权

评论回复
9
jiajs| | 2022-10-15 19:20 | 只看该作者

延时的效率好低
呵呵

使用特权

评论回复
10
wangpe|  楼主 | 2022-10-15 19:22 | 只看该作者
多谢楼上们的好程序

使用特权

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

本版积分规则

938

主题

9837

帖子

2

粉丝