//------------------------------------------------------------
// 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);
}
}
SPWM.rar_pic16f716 逆变器_pic16f716逆变_全桥_全桥逆变_逆变器
版权申诉
5星 · 超过95%的资源 33 浏览量
2022-07-15
19:17:07
上传
评论 3
收藏 2KB RAR 举报
寒泊
- 粉丝: 75
- 资源: 1万+
最新资源
- 信呼OA系统2.1.7版源码
- 3122080306 邹子轩 实验报告二.docx
- 基于STM32 NUCLEO板设计彩色LED照明灯(纯cubeMX开发)(大赛作品,文档完整,可直接运行)
- 发那科工业机器人保养大全
- Sphere.h
- REMD固有时间尺度分解信号分量可视化(Matlab完整源码和数据)
- 嵌入式系统双单片机STC89C52+STC15W104多功能学习板电路图可扩展 适用于单片机初学者和教学
- 基于STM32蓝牙控制小车系统设计(硬件+源代码+论文)大赛作品
- XILINXFPGA源码基于Spartan3火龙刀系列FPGA开发板VGA测试例程
- Java聊天室的设计与实现【尚学堂·百战程序员】
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论11