找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1021|回复: 11
打印 上一主题 下一主题
收起左侧

网上代码PIC16F716单片机逆变程序用来学习编译不成功求教

[复制链接]
跳转到指定楼层
楼主
//------------------------------------------------------------
//       spwm信号调制
//------------------------------------------------------------
//PIC单片机PIC16F716,包含PWM调制,AD采样,PI控制算法
#include <pic16f716.h>
#include<pic.h>
#include<string.h>
#include<stdio.h>
//------------------------------------------------------------  
//系统配置
__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//负半周
                           };         
unsigned char sin_num;//SIN函数表查表变量
bank1 float  sin_am,sin_l,sin_d;//浮点数,幅值变量,临时变量,临时变量
bit direction;//控制方向
unsigned char AD_result;//存放AD转换结果
typedef struct PID {
                    double Setpoint; //设定目标   
                    double Proportion;//比例常数
                    double Integral;//积分常数
                    double Derivative;//微分常数
                    double LastError;//Error【-1】,使用差分方程
                    double PrevError;//Error【-2】
                    double SumError;
                    }PID;//定义PID相关数据类型
/*************************************************************************************************/

//***************PID计算函数*****************
double PID_calc(PID *pp,double NextPoint)
{
   double dError,
           Error;
  Error=pp->Setpoint-NextPoint;          //偏差
  pp->SumError+=Error;                   //积分
  dError=pp->LastError-pp->PrevError;   //当前微分
  pp->PrevError=pp->LastError;
  pp->LastError=Error;
       return(pp->Proportion*Error       //比例项
              + pp->Integral*pp->SumError//积分项
              + pp->Derivative*dError);  //微分项
}

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

//**************PID执行函数*****************
void actuator(double rDelta)
{

}

//*************软件延时子程序***************
void       DELAY()
{
unsigned int i;
   for(i=200;i>0;i--);
}

//******************中断服务程序*************************************
void interrupt ISR()  
{
//-------PWM中断函数-------------------
    if(TMR2IF&TMR2IE)
    {
    CLRWDT();//清除看门狗  
    TMR2IF=0;//清零中断标志位
    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转换**********************************
unsigned char START_A2D()
{
DELAY();//采样延时
GO=1;//开始AD转换
while(GO);//等待转化完成
AD_result=ADRES;
return(AD_result);
}

//*********************pwm初始化函数*******************************
void INIT_CCP()
{
PR2=0x9C; //十进制156
CCP1CON=0b11001100;// 1100 1100四输出全桥驱动,占空比低2位暂时清零,
//PWM 模式。P1A,P1C高电平有效;P1B, P1D 高电平有效;
CCPR1L=0x00;//占空比清零
TMR2IF=0; //Timer2 中断标志位清零
T2CON=0b00000100; //0010 0100预分频1,后分频1:1,使能timer2
TMR2IE=1; //允许TMR2 和 PR2 匹配中断
}


//********************AD初始化**************************************
void INIT_A2D()
{
//--------------ADCON0----------------
ADCS1=0;ADCS0=1;//Fosc/8,外接16M晶振时采样时间约为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端口为输入
}



//****************************主函数*********************************************
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;//调节AC幅度
PEIE=1;
GIE=1;
while(1)
{

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

本人在编译这个程序的时候遇到的问题如下:
1、编译器为picc9.83,源码复制张贴编译报错很多actuator(double rOut);此处也报错,删double后没有报错了,但是出现了以下报错:

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
当这行代码:bank1 float  sin_am,sin_l,sin_d;变量类型改为int 型或者char型的时候编译成功,但是烧写后,只有两路互补146hz方波输出,没有spwm调制波输出,还望论坛里的大神指。

float错误.jpg (340.19 KB, 下载次数: 99)

float错误.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:883242 发表于 2024-3-17 16:53 | 只看该作者
double删了就算不对了,结果不可能正确。原来可能是XC8编译的,你找找。
回复

使用道具 举报

板凳
ID:1109639 发表于 2024-3-17 22:11 | 只看该作者
用xc8编译器也不行,还是在double那行也有报错
回复

使用道具 举报

地板
ID:883242 发表于 2024-3-17 22:39 | 只看该作者
挽尘 发表于 2024-3-17 22:11
用xc8编译器也不行,还是在double那行也有报错

单片机只有128字节RAM,显然是内存空间溢出了,你用了太多的double,你可以先换个内存大的单片机让编译器编译通过,然后看一下需要多少资源才能支撑你的代码。
回复

使用道具 举报

5#
ID:1109639 发表于 2024-3-18 21:36 | 只看该作者
Hephaestus 发表于 2024-3-17 22:39
单片机只有128字节RAM,显然是内存空间溢出了,你用了太多的double,你可以先换个内存大的单片机让编译器 ...

整了几天了还是整不出来,太难受了,我先去重新学基础吧。没办法搞了
回复

使用道具 举报

6#
ID:1110945 发表于 2024-3-18 22:20 | 只看该作者
这货那么贵,一个五毛的xx32都比它强,要是程序和算法做得好,
甚至比8010都强,等过一段我也来做做正弦波。
回复

使用道具 举报

7#
ID:1109639 发表于 2024-3-20 00:27 | 只看该作者
明日之星8 发表于 2024-3-18 22:20
这货那么贵,一个五毛的xx32都比它强,要是程序和算法做得好,
甚至比8010都强,等过一段我也来做做正弦波 ...

大佬带带我
回复

使用道具 举报

8#
ID:1110945 发表于 2024-3-20 09:58 | 只看该作者
学32位机吧,用它的定时器刹车中断做短路保护,理论上“0”微秒响应,
现实中不到10微秒就能保护,想要“防烧”是有可能的,只有输出端高压侧
的两个管不能直接的检测到短路信号,只能间接的检测短路信号实现保护。
我们知道离网逆变器交流输出端最怕碰上电网......
回复

使用道具 举报

9#
ID:136083 发表于 2024-3-20 18:06 | 只看该作者
逆变涉及到的知识面比较广泛,好好研究.
回复

使用道具 举报

10#
ID:1109639 发表于 2024-3-21 06:12 | 只看该作者
desig 发表于 2024-3-20 18:06
/*
* File:   pic16f716_main.c
* XC8 1.41

感谢大佬,待我试试看,万分感谢分享。
回复

使用道具 举报

11#
ID:675799 发表于 2024-3-21 10:18 | 只看该作者
STC8H, 足够了,几毛的东西。 代码都处都有。
回复

使用道具 举报

12#
ID:1109639 发表于 2024-3-21 15:13 | 只看该作者
hww22 发表于 2024-3-21 10:18
STC8H, 足够了,几毛的东西。 代码都处都有。

真的假的?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表