• SMT(SF)


    示例一:

            uint iPwmDuty;
            double temp;
            
            temp = (double)AdConvert(AN_TEMPERATURE);
            temp = temp/250;
            
            iPwmDuty = (int)(temp+0.5)>(int)temp?(int)temp+1:(int)temp;

    如果参数在xx.5附近,易产生不稳定摆动

    SMT(SF)

            uint iPwmDuty;
            uint temp,temp4,temp6;
            static uint LastiPwmDuty;
        
            temp = AdConvert(AN_TEMPERATURE);
            temp = temp/25; //放大10倍,保留一位小数
            
            temp6 = (temp+4)/10;
            temp4 = (temp+6)/10;
            temp = temp/10;
            
            if(temp6 > temp) 
            {
                iPwmDuty = temp6;
            }
            else if(temp4 == temp)
            {
                iPwmDuty = temp;
            }
            else
            {
                if(temp >= LastiPwmDuty)//由小到大
                {
                    iPwmDuty = temp6;
                }
                else //(iPwmDuty < LastiPwmDuty)
                {
                    iPwmDuty = temp4;
                }
            }
            LastiPwmDuty = iPwmDuty;

     示例二:

    uchar CanCharge(void)
    {
        uint temp;
        static uchar ChgState = FALSE;
        
        if(AdResult[AD_SUNBORD] > AdResult[AD_OPEN_BAT] )  
        {
            temp = AdResult[AD_SUNBORD] - AdResult[AD_OPEN_BAT];
        }
        else 
        {
            temp = 0;
        }
    if (temp > 80)// 1V = 1/2.5/4.096*4096 = 400; 0.1V = 40; { ChgState = TRUE; } else if(temp <= 0) { ChgState = FALSE; } return ChgState; }

      示例三:

    //#include<pic16f1828.h>
    #include<htc.h>
    #include "adc.h"
    
    __CONFIG(FOSC_INTOSC&WDTE_OFF&PWRTE_ON&MCLRE_OFF&CP_ON&CPD_ON&BOREN_ON&CLKOUTEN_OFF&IESO_OFF&FCMEN_OFF);
    __CONFIG(WRT_ALL&PLLEN_OFF&STVREN_ON&LVP_OFF);
    
    #define uchar unsigned char
    #define uint unsigned int
    
    #define RLY1 LATA5
    #define RLY2 LATA4
    #define RLY3 LATC4
    
    #define RLY_ON 0
    #define RLY_OFF 1
    #define LED_ON 1
    #define LED_OFF 0
    #define TRUE 1
    #define FALSE 0
    
    #define LED1 LATC2  //LED1(DS3)-RLY1
    #define LED2 LATC1    //LED2(DS2)-RLY2
    #define LED3 LATC0   //LED3(DS1)-RLY3
    
    
    #define Connect3 262         //26.2V
    #define DisConnect3 238        //23.8V
    #define Connect2 260        
    #define DisConnect2 225
    #define Connect1 255        //25.5V
    #define DisConnect1 215        //21.5V
    
    
    void DisplayLed(void);
    
    void main()
    {
        uint BAT_SENSE ,BAT_VOLT;
        static uint LoadConnect3,LoadConnect2,LoadConnect1;
        static uint LoadDisConnect3,LoadDisConnect2,LoadDisConnect1;
        static uchar RLY1_States,RLY2_States,RLY3_States;
        
        init_a2d();
        
        TRISA = 0x08; //MCLR = 1;
        TRISC = 0x40;
        ANSELC= 0x40; //set anolog in    
        
        BAT_SENSE = MiddleADValue(8);
        BAT_VOLT = (uint)(BAT_SENSE*0.78125);//AD/1024*5*16 = (V);    5*160/1024 =800/1024 = 0.78125(参数放大10倍)
    
        //Automatic system voltage recognition
        if(BAT_VOLT <180){//12V
                LoadConnect3 = Connect3>>1;    
                LoadDisConnect3 = DisConnect3>>1;
                LoadConnect2 = Connect2>>1;    
                LoadDisConnect2 = DisConnect2>>1;
                LoadConnect1 = Connect1>>1;    
                LoadDisConnect1 = DisConnect1>>1; 
        }else if(BAT_VOLT >360){//48V
                LoadConnect3 = Connect3<<1;    
                LoadDisConnect3 = DisConnect3<<1;
                LoadConnect2 = Connect2<<1;        
                LoadDisConnect2 = DisConnect2<<1;
                LoadConnect1 = Connect1<<1;        
                LoadDisConnect1 = DisConnect1<<1; 
        }else{//24V
                LoadConnect3 = Connect3;        
                LoadDisConnect3 = DisConnect3;
                LoadConnect2 = Connect2;        
                LoadDisConnect2 = DisConnect2;
                LoadConnect1 = Connect1;        
                LoadDisConnect1 = DisConnect1; 
        }
    
            RLY1_States = FALSE;
            RLY2_States = FALSE;
            RLY3_States = FALSE;
            RLY1 = RLY_OFF;
            RLY2 = RLY_OFF;
            RLY3 = RLY_OFF;
            
            LED1 = LED_OFF;
            LED2 = LED_OFF;
            LED3 = LED_OFF;
        }
    
        while(1)
        {    
            BAT_SENSE = MiddleADValue(8);
            BAT_VOLT = (uint)(BAT_SENSE*0.78125);//5*160/1024 =800/1024 = 0.78125
            
            if(BAT_VOLT < LoadDisConnect1)
            {
                RLY1_States = FALSE;
            }
            else if(BAT_VOLT > LoadConnect1)
            {
                RLY1_States = TRUE;
            }
            
            if(BAT_VOLT < LoadDisConnect2)
            {
                RLY2_States = FALSE;
            }
            else if(BAT_VOLT > LoadConnect2)
            {
                RLY2_States = TRUE;
            }
            
            if(BAT_VOLT < LoadDisConnect3)
            {
                RLY3_States = FALSE;
            }
            else if(BAT_VOLT > LoadConnect3)
            {
                RLY3_States = TRUE;
            }
            //=====================================================
            if(RLY1_States == TRUE)
            {
                RLY1 = RLY_ON;    
            }
            else
            {
                RLY1 = RLY_OFF;    
            }
            if(RLY2_States == TRUE)
            {
                RLY2 = RLY_ON;    
            }
            else
            {
                RLY2 = RLY_OFF;    
            }
            if(RLY3_States == TRUE)
            {
                RLY3 = RLY_ON;    
            }
            else
            {
                RLY3 = RLY_OFF;    
            }
            DisplayLed();
            _delay(30000);
        }
    }
    
    void DisplayLed(void)
    {
        //LED state set synchronization
        if(RLY1_States == TRUE)
        {        
            LED1 = LED_ON;    
        }
        else
        {
            LED1 = !LED1;
        }
        
        if(RLY2_States == TRUE)
        {    
            LED2 = LED_ON;
        }
        else
        {
            LED2 = !LED2;
        }
        
        if(RLY3_States == TRUE)
        {
            LED3 = LED_ON;
        }
        else 
        {
            LED3 = !LED3; //One LED twinkle
        }
    }
    //#include<pic16f1828.h>
    #include<htc.h>
    #include "adc.h"
    
    
    __CONFIG(FOSC_INTOSC&WDTE_ON&PWRTE_OFF&MCLRE_OFF&CP_ON&CPD_ON&BOREN_ON&CLKOUTEN_OFF&IESO_OFF&FCMEN_OFF);
    __CONFIG(WRT_ALL&PLLEN_OFF&STVREN_ON&LVP_OFF);
    
    #define uchar unsigned char
    #define uint unsigned int
    
    #define RLY1 LATA5
    #define RLY2 LATA4
    #define RLY3 LATC4
    
    #define RLY_ON 0
    #define RLY_OFF 1
    #define LED_ON 1
    #define LED_OFF 0
    
    #define LED1 LATC2  //LED1(DS3)-RLY1
    #define LED2 LATC1    //LED2(DS2)-RLY2
    #define LED3 LATC0   //LED3(DS1)-RLY3
    
    
    #define Connect3 262         //26.2V
    #define DisConnect3 238        //23.8V
    #define Connect2 260        
    #define DisConnect2 225
    #define Connect1 255        //25.5V
    #define DisConnect1 215        //21.5V
    
    
    void DisplayLed(void);
    
    void main()
    {
        uchar flag;
        uint BAT_SENSE ,BAT_VOLT;
    
        static uint LoadConnect3,LoadConnect2,LoadConnect1;
        static uint LoadDisConnect3,LoadDisConnect2,LoadDisConnect1;
    
        init_a2d();
        
        TRISA = 0x08; //MCLR = 1;
        TRISC = 0x40;
        ANSELC= 0x40; //set anolog in    
        
        BAT_SENSE = MiddleADValue(8);
        BAT_VOLT = (uint)(BAT_SENSE*0.78125);//AD/1024*5*16 = (V);    5*160/1024 =800/1024 = 0.78125(参数放大10倍)
    
        //Automatic system voltage recognition
        if(BAT_VOLT <180){//12V
                LoadConnect3 = Connect3>>1;    
                LoadDisConnect3 = DisConnect3>>1;
                LoadConnect2 = Connect2>>1;    
                LoadDisConnect2 = DisConnect2>>1;
                LoadConnect1 = Connect1>>1;    
                LoadDisConnect1 = DisConnect1>>1; 
        }else if(BAT_VOLT >360){//48V
                LoadConnect3 = Connect3<<1;    
                LoadDisConnect3 = DisConnect3<<1;
                LoadConnect2 = Connect2<<1;        
                LoadDisConnect2 = DisConnect2<<1;
                LoadConnect1 = Connect1<<1;        
                LoadDisConnect1 = DisConnect1<<1; 
        }else{//24V
                LoadConnect3 = Connect3;        
                LoadDisConnect3 = DisConnect3;
                LoadConnect2 = Connect2;        
                LoadDisConnect2 = DisConnect2;
                LoadConnect1 = Connect1;        
                LoadDisConnect1 = DisConnect1; 
        }
    
        
            flag = 0;
            RLY1 = RLY_OFF;
            RLY2 = RLY_OFF;
            RLY3 = RLY_OFF;
            
            LED1 = LED_OFF;
            LED2 = LED_OFF;
            LED3 = LED_OFF;
        }
    
        while(1)
        {    
            BAT_SENSE = MiddleADValue(8);
            BAT_VOLT = (uint)(BAT_SENSE*0.78125);//5*160/1024 =800/1024 = 0.78125
            
            //Determine which range of BAT_VOLT
            if(BAT_VOLT<LoadDisConnect1)
            {
                RLY1 = RLY_OFF;
                RLY2 = RLY_OFF;
                RLY3 = RLY_OFF;
                flag = 0;
            }
            else if((BAT_VOLT>=LoadDisConnect1)&&(BAT_VOLT<LoadDisConnect2))
            {    
                if(flag > 1)//由大到小
                {    
                    //RLY1 = RLY1;
                    RLY2 = RLY_OFF;    
                    RLY3 = RLY_OFF;    
                }else if(flag <= 1){
        
                }
                flag = 1;
            }
            else if((BAT_VOLT>=LoadDisConnect2)&&(BAT_VOLT<LoadDisConnect3))
            {    
                if(flag > 2)
                {    
                    //RLY1 = RLY1;
                    //RLY2 = RLY2;
                    RLY3 = RLY_OFF;        
                }
                flag = 2;
            }
            /*-------------------------------------------------------*/
            else if((BAT_VOLT>=LoadDisConnect3)&&(BAT_VOLT<LoadConnect1))
            {    
                    //RLY1 = RLY1;
                    //RLY2 = RLY2;
                    //RLY3 = RLY3;
                    flag = 3;
            }
            /*-------------------------------------------------------*/
            else if((BAT_VOLT>=LoadConnect1)&&(BAT_VOLT<LoadConnect2))
            {    
                if(flag < 4){
    
                    RLY1 = RLY_ON;
                    //RLY2 = RLY2;
                    //RLY3 = RLY3;
                }
                flag = 4;
            }else if((BAT_VOLT>=LoadConnect2)&&(BAT_VOLT<LoadConnect3))
            {    
                if(flag < 5)
                {
                    RLY1 = RLY_ON;
                    RLY2 = RLY_ON;
                    //RLY3 = RLY3;
                }
                flag = 5;
            
            }else if(BAT_VOLT>=LoadConnect3)
            {
                RLY1 = RLY_ON;    
                RLY2 = RLY_ON;    
                RLY3 = RLY_ON;    
                flag = 6;
            }
            DisplayLed();
            _delay(30000);
        }
    }
    
    void DisplayLed(void)
    {
        //LED state set synchronization
        if(RLY1 == RLY_ON)
        {        
            LED1 = LED_ON;    
        }
        else
        {
            LED1 = !LED1;
        }
        
        if(RLY2 == RLY_ON)
        {    
            LED2 = LED_ON;
        }
        else
        {
            LED2 = !LED2;
        }
        
        if(RLY3 == RLY_ON)
        {
            LED3 = LED_ON;
        }
        else 
        {
            LED3 = !LED3; //One LED twinkle
        }
    }

    施密特算法

  • 相关阅读:
    Unity 游戏框架搭建 2019 (二十九) 方法所在类命名问题诞生的原因
    Unity 游戏框架搭建 2019 (二十七、二十八)弃用的代码警告解决&弃用的代码删除
    Unity 游戏框架搭建 2019 (二十六) 第一轮整理完结
    Unity 游戏框架搭建 2019 (二十五) 类的第一个作用 与 Obselete 属性
    排序算法之冒泡排序
    java中List Array相互转换
    java迭代器浅析
    谈谈java中遍历Map的几种方法
    浅谈java反射机制
    springMvc注解之@ResponseBody和@RequestBody
  • 原文地址:https://www.cnblogs.com/liushao/p/7324089.html
Copyright © 2020-2023  润新知