找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1108|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

求教,蘿麗單向有刷移植到8g1k08a單片機(jī),輸出不正常

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1101801 發(fā)表于 2023-12-4 17:08 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
首先,小弟是真小白,完全靠蒙。
根據(jù)上次改點(diǎn)火的經(jīng)驗(yàn),改了部分程序,輸出有反應(yīng)。


油門最低0v……推15% led閃1.6v……推89% led亮3.2v。期間亮度無(wú)變化(看不出有pwm效果)

推油門過(guò)程,萬(wàn)用表測(cè)得只有0v、1.6v和3.2v三個(gè)電平(這樣叫不知道對(duì)不對(duì)),沒(méi)有線性變化。

問(wèn)題1:怎么改?才能線性變化。
問(wèn)題2:15w104運(yùn)行頻率是12m,換8g1k改成24m甚至35m,又該怎么改。

源碼如下:

#include<stc8g1k08a.h>
#define u8 unsigned char
#define u16 unsigned int

//sfr P3M1=0xb1;
//sfr P3M0=0xb2;

//sfr IAP_DATA=0xc2;
//sfr IAP_ADDRH=0xc3;
//sfr IAP_ADDRL=0xc4;
//sfr IAP_CMD=0xc5;
//sfr IAP_TRIG=0xc6;
//sfr IAP_CONTR=0xc7;

//sfr AUXR=0x8e;
//sfr T2H=0xd6;
//sfr T2L=0xd7;
//sfr IE2=0xaf;

sbit LED=P3^2;
sbit PWM=P3^3;
sbit IN=P5^4;

u8  H_l,H_h,L_l,L_h;
u16 time,proportion,tt,MAX,min,k;               //min改MIN,編譯會(huì)語(yǔ)法錯(cuò)誤,什么鬼
u8 low,top,ok,lose,calabration,MARK1,MARK2,over=1,error;
bit turn;

void Delay1ms()                //@12.000MHz
{
        unsigned char i, j;

        i = 12;
        j = 169;
        do
        {
                while (--j);
        } while (--i);
}

void delay(u16 t)
{
        while(t--)
        Delay1ms();
}

u8 EEPROM_read(u8 address)
{
        IAP_CMD=0x01;
        IAP_ADDRH=0;
        IAP_ADDRL=address;
        IAP_TRIG=0x5a;
        IAP_TRIG=0xa5;
        return IAP_DATA;
}

void EEPROM_write(u8 address,u8 byte)
{
        IAP_CMD=0x02;
        IAP_DATA=byte;
        IAP_ADDRH=0;
        IAP_ADDRL=address;
        IAP_TRIG=0x5a;
        IAP_TRIG=0xa5;
        
}

void EEPROM_clean(u8 address)
{
        IAP_CMD=0x03;
        IAP_ADDRH=0;
        IAP_ADDRL=address;
        IAP_TRIG=0x5a;
        IAP_TRIG=0xa5;
}

void DATA_read()
{
        IAP_CONTR=0x82;
        MARK1=EEPROM_read(0);
        MARK2=EEPROM_read(1);
        MAX=EEPROM_read(2);
        MAX<<=8;
        MAX+=EEPROM_read(3);
        min=EEPROM_read(4);
        min<<=8;
        min+=EEPROM_read(5);
        IAP_CONTR=0;
}

void DATA_save()
{
        IAP_CONTR=0x82;
        EEPROM_clean(0);
        EEPROM_write(0,0x0f);
        EEPROM_write(1,0xa5);
        EEPROM_write(2,MAX>>8);
        EEPROM_write(3,MAX);
        EEPROM_write(4,MIN>>8);
        EEPROM_write(5,min);
        IAP_CONTR=0;
}

void measure()
{
        time=0;
        TL0=0,TH0=0;
        while(!IN);
        TR0=1;
        while(IN);
        TR0=0;
        time=TH0;
        time<<=8;
        time+=TL0;               
}

void LED_flash(u8 m)
{
        while(m--)
        {
                LED=1;delay(50);
                LED=0;delay(50);
        }
}


void initial()
{
        u8 i;
        P3M0 = 0xff; P3M1 = 0x00;                                 
  P5M0 = 0x00; P5M1 = 0x00;
  P3=0x0c;                                 
  TMOD=0x11;        //T0、T1工作模式12T
  TL0=0;
  TH0=0;
  TL1=0;
  TH1=0;
        delay(100);


        measure();
        measure();
        measure();
        measure();
        measure();


        while(PCON)
        {
        PCON=0,delay(10);                          //低壓保護(hù),如果1S電池的電壓低于
        }                                                          //下載時(shí)的設(shè)定值,則在此死循環(huán)

        
        

        DATA_read();
        if(MARK1!=0x0f||MARK2!=0xa5)//新增 16bit驗(yàn)證,降低錯(cuò)誤率
        {
               
                MAX=1950;min=1000;//新增 開機(jī)自帶1ms-2ms標(biāo)準(zhǔn)行程
               
        }
        
        over=1;
        while(over)
        {
                measure();
               
                if(time>1700)//重新校準(zhǔn)行程判斷
                {
                        i++;
                        if(i>100)over=0,calabration=1;
                }
                else                                   //
                {
                        if(time<min+100)over=0;
                }
        }        
        
        
        if(MAX>2200||min<800)//新增 數(shù)據(jù)驗(yàn)證,降低錯(cuò)誤率
        {
                calabration=1;
                if(MAX<1700||min>1300)calabration=1;
        }

        if(calabration)
        {
                while(over)
                {
                        measure();
                        if(time>1700)over=0;
                }
                delay(1000);
                LED_flash(10);
                measure();
                measure();
                if(time>800&&time<2200)MAX=time;
                else error=1;         
               
                over=1;
                while(over)
                {
                        measure();
                        if(time<1300)over=0;
                }         
                delay(1000);
                LED_flash(10);
                measure();
                measure();
                if(time>800&&time<2200)min=time;
                else error=1;

                if(error==0)DATA_save();        

        }

               
}

main()
{
        initial();
        k=MAX-min;
        IE=0x80;
        ET1=1;           //開T1中斷

        while(1)
        {
                 measure();
                if(lose)
                {
                        delay(1000);
                        measure();
                        measure();
                }
               
                if(time>800&&time<2260)
                {
                        
                        
                        ok=1;lose=0;TR1=1;


                        
                        if(time>MAX-20)time=MAX-20,top=1;
                        else top=0;
                        if(time<min+100)time=min+100,low=1;
                        else low=0;
        
                        proportion=(long)(time-min)*1000/k;
                        H_l=65535-proportion ;        
                        H_h=((65535-proportion)>>8);
                        L_l=64535+proportion;
                        L_h=((64535+proportion)>>8);
                }
                                 

        }
}

void et1()interrupt 3
{

        turn=!turn;
  if(turn)
        {
                if(top)PWM=1,T2L=0x0b,T2H=0xfe;
                else PWM=0,T2L=H_l,T2H=H_h;
        }
        else
        {
                if(low)PWM=0,T2L=0x0b,T2H=0xfe;
                else PWM=1,T2L=L_l,T2H=L_h;
        }

        LED=PWM;//新增LED亮度隨油門變化
        
        tt++;
        if(ok)tt=0;

        else {if(tt>2000)tt=2000,PWM=0,turn=0,TR1=0,LED=0,lose=1;}
        ok=0;


}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表