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

QQ登錄

只需一步,快速開始

搜索
查看: 1678|回復(fù): 11
收起左側(cè)

網(wǎng)上代碼PIC16F716單片機(jī)逆變程序用來(lái)學(xué)習(xí)編譯不成功求教

[復(fù)制鏈接]
ID:1109639 發(fā)表于 2024-3-17 04:30 | 顯示全部樓層 |閱讀模式
//------------------------------------------------------------
//       spwm信號(hào)調(diào)制
//------------------------------------------------------------
//PIC單片機(jī)PIC16F716,包含PWM調(diào)制,AD采樣,PI控制算法
#include <pic16f716.h>
#include<pic.h>
#include<string.h>
#include<stdio.h>
//------------------------------------------------------------  
//系統(tǒng)配置
__CONFIG(0xfff6);
//-------------------------------------------
#define Reference  0.5;//給定參考值,即PID中的Setpoint
const unsigned char sin_[]={0,8,16,23,31,38,46,53,60,67,74,81,87,93,99,105,111,116,121,126,130,134,138,142,145,147,150,152,154,155,156,156,//正半周
                            156,
                            156,156,155,154,152,150,147,145,142,138,134,130,126,121,116,111,105,99,93,87,81,74,67,60,53,46,38,31,23,16,8,1//負(fù)半周
                           };         
unsigned char sin_num;//SIN函數(shù)表查表變量
bank1 float  sin_am,sin_l,sin_d;//浮點(diǎn)數(shù),幅值變量,臨時(shí)變量,臨時(shí)變量
bit direction;//控制方向
unsigned char AD_result;//存放AD轉(zhuǎn)換結(jié)果
typedef struct PID {
                    double Setpoint; //設(shè)定目標(biāo)   
                    double Proportion;//比例常數(shù)
                    double Integral;//積分常數(shù)
                    double Derivative;//微分常數(shù)
                    double LastError;//Error【-1】,使用差分方程
                    double PrevError;//Error【-2】
                    double SumError;
                    }PID;//定義PID相關(guān)數(shù)據(jù)類型
/*************************************************************************************************/

//***************PID計(jì)算函數(shù)*****************
double PID_calc(PID *pp,double NextPoint)
{
   double dError,
           Error;
  Error=pp->Setpoint-NextPoint;          //偏差
  pp->SumError+=Error;                   //積分
  dError=pp->LastError-pp->PrevError;   //當(dāng)前微分
  pp->PrevError=pp->LastError;
  pp->LastError=Error;
       return(pp->Proportion*Error       //比例項(xiàng)
              + pp->Integral*pp->SumError//積分項(xiàng)
              + pp->Derivative*dError);  //微分項(xiàng)
}

//**************PID初始化函數(shù)***************
void INIT_pid(PID *pp)
{
  memset(pp,0,sizeof(PID));
}

//**************PID執(zhí)行函數(shù)*****************
void actuator(double rDelta)
{

}

//*************軟件延時(shí)子程序***************
void       DELAY()
{
unsigned int i;
   for(i=200;i>0;i--);
}

//******************中斷服務(wù)程序*************************************
void interrupt ISR()  
{
//-------PWM中斷函數(shù)-------------------
    if(TMR2IF&TMR2IE)
    {
    CLRWDT();//清除看門狗  
    TMR2IF=0;//清零中斷標(biāo)志位
    sin_d=sin_am*sin_[sin_num];
         if(sin_d>=156)sin_l=156;//限幅
    sin_l=(unsigned char)sin_d;
    CCPR1L=sin_l;
    sin_num++;
     if(65==sin_num)
     {
       sin_num=0;
       direction=~direction;//換向
       P1M1=direction;
     }
    }
}

//*********************開始AD轉(zhuǎn)換**********************************
unsigned char START_A2D()
{
DELAY();//采樣延時(shí)
GO=1;//開始AD轉(zhuǎn)換
while(GO);//等待轉(zhuǎn)化完成
AD_result=ADRES;
return(AD_result);
}

//*********************pwm初始化函數(shù)*******************************
void INIT_CCP()
{
PR2=0x9C; //十進(jìn)制156
CCP1CON=0b11001100;// 1100 1100四輸出全橋驅(qū)動(dòng),占空比低2位暫時(shí)清零,
//PWM 模式。P1A,P1C高電平有效;P1B, P1D 高電平有效;
CCPR1L=0x00;//占空比清零
TMR2IF=0; //Timer2 中斷標(biāo)志位清零
T2CON=0b00000100; //0010 0100預(yù)分頻1,后分頻1:1,使能timer2
TMR2IE=1; //允許TMR2 和 PR2 匹配中斷
}


//********************AD初始化**************************************
void INIT_A2D()
{
//--------------ADCON0----------------
ADCS1=0;ADCS0=1;//Fosc/8,外接16M晶振時(shí)采樣時(shí)間約為600ns
CHS2=0;CHS1=1;CHS0=0;//RA2作為輸入通道
//--------------ADCON1----------------
PCFG2=0;PCFG1=0;PCFG0=0;//AN3:0都為模擬輸入

ADON=1;//打開AD模塊
}

//******************初始化端口*************************************
void INIT_PORT()
{
//---------端口B初始化---------------
TRISB=0;//B端口為輸出
PORTB=0X00;
//---------端口A初始化---------------
TRISA=1;//A端口為輸入
}



//****************************主函數(shù)*********************************************
void main(void)  
{
PID  sPID;
double  rOut;
double  rIn;

INIT_pid(&sPID);
sPID.Proportion=0.5;
sPID.Integral=0.5;
sPID.Derivative=0.0;
sPID.Setpoint=1.0;

INIT_CCP();
INIT_PORT();
direction=0;
sin_num=0;
sin_am=Reference;//調(diào)節(jié)AC幅度
PEIE=1;
GIE=1;
while(1)
{

rIn=START_A2D();
rOut=PID_calc(&sPID,rIn);
actuator(double rOut);
}
}

本人在編譯這個(gè)程序的時(shí)候遇到的問(wèn)題如下:
1、編譯器為picc9.83,源碼復(fù)制張貼編譯報(bào)錯(cuò)很多actuator(double rOut);此處也報(bào)錯(cuò),刪double后沒(méi)有報(bào)錯(cuò)了,但是出現(xiàn)了以下報(bào)錯(cuò):

Executing: "d:\Program Files (x86)\HI-TECH Software\PICC\9.83\bin\picc.exe" --pass1 C:\Users\WanChen\Desktop\PICPWM\pwm16\pwm.c -q --chip=16F716 -P --runtime=default --opt=default -D__DEBUG=1 -g --asmlist "--errformat=Error   [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s"
Warning [162] d:\Program Files (x86)\HI-TECH Software\PICC\9.83\include\pic16f716.h; 3.81 #warning: Header file pic16f716.h included directly. Use #include <htc.h> instead.
Warning [356] C:\Users\WanChen\Desktop\PICPWM\pwm16\pwm.c; 78.13 implicit conversion of float to integer
Executing: "d:\Program Files (x86)\HI-TECH Software\PICC\9.83\bin\picc.exe" -opwm.cof -mpwm.map --summary=default --output=default pwm.p1 --chip=16F716 -P --runtime=default --opt=default -D__DEBUG=1 -g --asmlist "--errformat=Error   [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s"
HI-TECH C Compiler for PIC10/12/16 MCUs (PRO Mode)  V9.83
Copyright (C) 2011 Microchip Technology Inc.
Serial number: HCPICP-11111 (PRO)
Error   [1360] C:\Users\WanChen\Desktop\PICPWM\pwm16\pwm.c; 87. no space for auto/param main@sPID
當(dāng)這行代碼:bank1 float  sin_am,sin_l,sin_d;變量類型改為int 型或者char型的時(shí)候編譯成功,但是燒寫后,只有兩路互補(bǔ)146hz方波輸出,沒(méi)有spwm調(diào)制波輸出,還望論壇里的大神指。
float錯(cuò)誤.jpg
回復(fù)

使用道具 舉報(bào)

ID:1109639 發(fā)表于 2024-3-21 15:13 | 顯示全部樓層
hww22 發(fā)表于 2024-3-21 10:18
STC8H, 足夠了,幾毛的東西。 代碼都處都有。

真的假的?
回復(fù)

使用道具 舉報(bào)

ID:675799 發(fā)表于 2024-3-21 10:18 | 顯示全部樓層
STC8H, 足夠了,幾毛的東西。 代碼都處都有。
回復(fù)

使用道具 舉報(bào)

ID:1109639 發(fā)表于 2024-3-21 06:12 | 顯示全部樓層
desig 發(fā)表于 2024-3-20 18:06
/*
* File:   pic16f716_main.c
* XC8 1.41

感謝大佬,待我試試看,萬(wàn)分感謝分享。
回復(fù)

使用道具 舉報(bào)

ID:136083 發(fā)表于 2024-3-20 18:06 | 顯示全部樓層
逆變涉及到的知識(shí)面比較廣泛,好好研究.
回復(fù)

使用道具 舉報(bào)

ID:1110945 發(fā)表于 2024-3-20 09:58 | 顯示全部樓層
學(xué)32位機(jī)吧,用它的定時(shí)器剎車中斷做短路保護(hù),理論上“0”微秒響應(yīng),
現(xiàn)實(shí)中不到10微秒就能保護(hù),想要“防燒”是有可能的,只有輸出端高壓側(cè)
的兩個(gè)管不能直接的檢測(cè)到短路信號(hào),只能間接的檢測(cè)短路信號(hào)實(shí)現(xiàn)保護(hù)。
我們知道離網(wǎng)逆變器交流輸出端最怕碰上電網(wǎng)......
回復(fù)

使用道具 舉報(bào)

ID:1109639 發(fā)表于 2024-3-20 00:27 | 顯示全部樓層
明日之星8 發(fā)表于 2024-3-18 22:20
這貨那么貴,一個(gè)五毛的xx32都比它強(qiáng),要是程序和算法做得好,
甚至比8010都強(qiáng),等過(guò)一段我也來(lái)做做正弦波 ...

大佬帶帶我
回復(fù)

使用道具 舉報(bào)

ID:1110945 發(fā)表于 2024-3-18 22:20 | 顯示全部樓層
這貨那么貴,一個(gè)五毛的xx32都比它強(qiáng),要是程序和算法做得好,
甚至比8010都強(qiáng),等過(guò)一段我也來(lái)做做正弦波。
回復(fù)

使用道具 舉報(bào)

ID:1109639 發(fā)表于 2024-3-18 21:36 | 顯示全部樓層
Hephaestus 發(fā)表于 2024-3-17 22:39
單片機(jī)只有128字節(jié)RAM,顯然是內(nèi)存空間溢出了,你用了太多的double,你可以先換個(gè)內(nèi)存大的單片機(jī)讓編譯器 ...

整了幾天了還是整不出來(lái),太難受了,我先去重新學(xué)基礎(chǔ)吧。沒(méi)辦法搞了
回復(fù)

使用道具 舉報(bào)

ID:883242 發(fā)表于 2024-3-17 22:39 | 顯示全部樓層
挽塵 發(fā)表于 2024-3-17 22:11
用xc8編譯器也不行,還是在double那行也有報(bào)錯(cuò)

單片機(jī)只有128字節(jié)RAM,顯然是內(nèi)存空間溢出了,你用了太多的double,你可以先換個(gè)內(nèi)存大的單片機(jī)讓編譯器編譯通過(guò),然后看一下需要多少資源才能支撐你的代碼。
回復(fù)

使用道具 舉報(bào)

ID:1109639 發(fā)表于 2024-3-17 22:11 | 顯示全部樓層
用xc8編譯器也不行,還是在double那行也有報(bào)錯(cuò)
回復(fù)

使用道具 舉報(bào)

ID:883242 發(fā)表于 2024-3-17 16:53 | 顯示全部樓層
double刪了就算不對(duì)了,結(jié)果不可能正確。原來(lái)可能是XC8編譯的,你找找。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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