C语言中延时器算法(定时器算法)

参考下文:

c语言中计数器(定时器)程序_modi000的博客-CSDN博客_c语言计数器

工作中经常会用到延时器

情形是:满足某一条件后,开始定时

方法一:

//在10ms中断函数中的判断
int timer = 0;

if(A!=B)
{
    timer = 100;
    A = B;
}else{
    if(timer == 0)
    {
        //do sth.
    }else{
    timer--;
}
}

 方法二:

int timer = 0;
int flag = 0;

if(timer>0)
{
    timer--;
}else{
   if(flag ==1)
    {
       flag = 0;
      //do sth.
    }  
}

if(flag == 0)
{
    if(A!=B)
    {
       timer = 100;
       flag = 1;
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的基于Perturb and Observe (P&O) 扰动算法的MPPT(最大功率点追踪)C语言实现代码: ```c #include<reg51.h> #define VREF 5.0 // 参考电压 #define K 0.02 // 扰动步长因子 sbit Pwm=P2^0; // PWM 输出引脚 sbit Incr=P1^0; // 增加电压扰动信号输入引脚 sbit Decr=P1^1; // 减少电压扰动信号输入引脚 float Vpv,Vpv_old,Ipv,Ppv,Vpv_ref,Pwm_duty; void ADC_Init() // ADC初始化 { ADCON=0x80; // A/D转换器开关打开 ADCON|=0x38; // 设定转换通道(AN0) P1ASF=0x01; // 将P1_0设置为模拟输入 } unsigned int Get_ADC() // 获取ADC值 { unsigned int adc_value; ADC_CONTR=0x8F; // 定时器1开始计数,转换电路打开,选择通道0 delay(2); // 延时等待转换完成 ADC_CONTR&=0xEF; // 关闭转换电路 adc_value=ADC_RES; // 获取ADC值 adc_value|=((unsigned int)ADC_RESL<<8); return adc_value; } void PWM_Init() // PWM初始化 { TMOD|=0x10; // 定时器1工作在模式1: 16位定时器模式 TH1=0x3C; // 设定定时器初值,产生PWM频率为50KHz TL1=0x00; Pwm=0; // PWM输出初始为低电平 TR1=1; // 启动定时器1 } void delay(unsigned char i) // 延时函数 { unsigned char j; while(i--) { j=250; while(j--); } } void Perturb_Observe() // 扰动观察法 { Vpv=(float)Get_ADC()*VREF/1024.0; // 获取PV电压值 Ipv=(float)Get_ADC()*VREF/1024.0; // 获取PV电流值 Ppv=Vpv*Ipv; // PV电压和电流的积即为PV功率值 if(Vpv>Vpv_old) // PV电压增加,需要减少电压扰动 { Vpv_ref=Vpv-K; // 扰动电压减小 } else if(Vpv<Vpv_old) // PV电压减小,需要增加电压扰动 { Vpv_ref=Vpv+K; // 扰动电压增加 } else // PV电压不变,维持当前扰动电压 { Vpv_ref=Vpv; } if(Vpv_ref<0.0) // 扰动电压不能为负数 { Vpv_ref=0.0; } if(Vpv_ref>VREF) // 扰动电压不能超过参考电压 { Vpv_ref=VREF; } Pwm_duty=Ppv/Vpv_ref; // 计算PWM占空比 if(Pwm_duty>1.0) // PWM占空比不能超过1 { Pwm_duty=1.0; } TH1=(65536-Pwm_duty*65535)/256; // 计算PWM高电平时间 TL1=(65536-Pwm_duty*65535)%256; Vpv_old=Vpv; // 保存当前PV电压值 } void main() { ADC_Init(); // 初始化ADC PWM_Init(); // 初始化PWM while(1) { Perturb_Observe(); // 扰动观察法追踪最大功率点 } } ``` 需要注意的是,以上代码仅为简单实现,实际应用需要进行更多的参数调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值