首页
|
新闻
|
新品
|
文库
|
方案
|
视频
|
下载
|
商城
|
开发板
|
数据中心
|
座谈新版
|
培训
|
工具
|
博客
|
论坛
|
百科
|
GEC
|
活动
|
主题月
|
电子展
注册
登录
论坛
博客
搜索
帮助
导航
默认风格
uchome
discuz6
GreenM
»
MCU 单片机技术
»
ARM
» 微机控制/最小拍控制的C语言描述
返回列表
回复
发帖
发新话题
发布投票
发布悬赏
发布辩论
发布活动
发布视频
发布商品
微机控制/最小拍控制的C语言描述
发短消息
加为好友
yuchengze
当前离线
UID
1062083
帖子
5837
精华
0
积分
2921
阅读权限
70
在线时间
222 小时
注册时间
2016-6-30
最后登录
2018-9-9
金牌会员
UID
1062083
性别
男
1
#
打印
字体大小:
t
T
yuchengze
发表于 2016-9-18 15:36
|
只看该作者
微机控制/最小拍控制的C语言描述
include
,
电路图
,
C语言
,
流程图
,
程序
参考电路图:
参考程序流程图:
参考程序:
/*****************************************
文件名:ACC4-1-1.C
功能描述:最小拍有纹波实验程序。
*****************************************/
#include
#include
#include
/*****************************************
宏定义
*****************************************/
#define uchar unsigned char
#define uint unsigned int
#define ADC_7 XBYTE[0x7ff0] //定义模数转换IO地址
#define DAC_1 XBYTE[0x7ff2] //定义D/A第一路的IO地
/*****************************************
全局变量
定义
*****************************************/
sbit str = P1^7; //定义A/D启动信号
sbit DIN0 = P1^0; //声明同步信号
uint data time; //声明变量,用于定时
uchar data t0_h,t0_l; //用于存储定时器0的初值
int TK=100; //声明采样周期变量,//采样周期=TK*10ms
int TC; //TK的变量
float KK0=0.5435; //系数kk0
float KK1=-0.2000; //系数kk1
float KK2=0; //系数kk2
float KK3=0; //系数kk3
float PP1=0.7170; //系数pp1
float PP2=0; //系数pp2
float PP3=0; //系数pp3
char UK; //当前时刻的D/A输出
char EK; //当前时刻的偏差
char UK_1,UK_2,UK_3,EK_1,EK_2,EK_3;//前3次采样时刻的控制量和偏差
/*****************************************
主函数
*****************************************/
void main(void)
{
TMOD = 0x01;
time = 10; //定时10ms
t0_h = (65536-500*time)/256; //计算定时器0初值
t0_l = (65536-500*time)%256;
t0_l = t0_l+20; //修正因初值重装而引起的定时误差
TH0 = t0_h;
TL0 = t0_l;
IT1 = 1; //边沿触发中断
EX1 = 1; //开外部中断1
ET0 = 1; //开定时中断0
TR0 = 1; //启动定时器
TC = 1;
DAC_1= 0x80; //D/A清零
UK=UK_1=UK_2=UK_3=0;
EK=EK_1=EK_2=EK_3=0;
EA = 1; //开总中断
while(1);
}
/**********************************************
函数名:INT1
功能 :1号外部中断服务程序
参数 :无*
返回值:无 *
***********************************************/
void int1()
interrupt
2 using 2
{ float i,j;
DIN0 = 1; //读取输入前,先输出高电平
if(DIN0) //判同步信号到否
{
UK=UK_1=UK_2=UK_3=0;
EK=EK_1=EK_2=EK_3=0;
DAC_1 =0x80; //D/A输出零
TC=1;
}
else
{
TC--; //判采样周期到否
if(TC==0)
{
EK = ADC_7-128; //采样当前的偏差值,并计算偏差的变化量
i=EK*KK0; //计算i=EK*KK0+EK_1*KK1+EK_2*KK2+EK_3*KK3)
i=i+EK_1*KK1;
i=i+EK_2*KK2;
i=i+EK_3*KK3;
j=UK_1*PP1; //计算j=UK_1*PP1+UK_2*PP2+UK_3*PP3
j=j+UK_2*PP2;
j=j+UK_3*PP3;
i=i-j; //i-j
if(i>0) //判控制量是否溢出,溢出赋极值
{
if(i>=127)
UK=127;
else
UK=(char)i;
}
else
{
if(i<-128)
UK=-128;
else
UK=(char)i;
}
DAC_1=UK+128; //D/A输出控制量
UK_3=UK_2; //控制量递推
UK_2=UK_1;
UK_1=UK;
EK_3=EK_2; //偏差递退
EK_2=EK_1;
EK_1=EK;
TC=TK; //采样周期变量恢复
}
}
}
/**********************************************
函数名:Timer0
功能 :定时器0中断服务程序
参数 :无
返回值:无
***********************************************/
void Timer0() interrupt 1 using 1
{
str = !str; //产生A/D启动信号
TH0 = t0_h; //重新装入初值
TL0 = t0_l;
}
参考结果:
阶跃有波纹
阶跃无波纹
斜坡有波纹
斜坡有波纹
收藏
分享
评分
回复
引用
订阅
TOP
返回列表
电商论坛
Pine A64
资料下载
方案分享
FAQ
行业应用
消费电子
便携式设备
医疗电子
汽车电子
工业控制
热门技术
智能可穿戴
3D打印
智能家居
综合设计
示波器技术
存储器
电子制造
计算机和外设
软件开发
分立器件
传感器技术
无源元件
资料共享
PCB综合技术
综合技术交流
EDA
MCU 单片机技术
ST MCU
Freescale MCU
NXP MCU
新唐 MCU
MIPS
X86
ARM
PowerPC
DSP技术
嵌入式技术
FPGA/CPLD可编程逻辑
模拟电路
数字电路
富士通半导体FRAM 铁电存储器“免费样片”使用心得
电源与功率管理
LED技术
测试测量
通信技术
3G
无线技术
微波在线
综合交流区
职场驿站
活动专区
在线座谈交流区
紧缺人才培训课程交流区
意见和建议