完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
向各位大神求助:我的毕设题目为基于单片机的低压无功补偿装置的研究我大概想法是:把电压电流信号经过过零比较器变换成与之同相位的方波信号,然后用其下降沿作为外部中断控制定时器的启停,用采集到的时间值求得相位差,进而计算出功率因数,但编程这块有点问题老是有问题,具体编程如下:
//利用外部中断控制定时器计时// #include #include #define uchar unsigned char #define uint unsigned int ***it led1=P1^0;//计时指示灯 ***it led2=P1^1;//电容器投入指示灯 ***it relay=P1^7;//电容器控制端 float pi,t,pfact,fi; void main() { TMOD=0x01;//选定时器0的工作方式1 TH0=0;//定时器0初始化 TL0=0; EA=1;//开启总中断 IT0=1;//外部中断选择下降沿触发 IT1=1; EX0=1;//开启外部中断 EX1=1; pi=3.141592653; while(1);//等待中断响应 } //外部中断0响应后定时器首先清零,然后开启定时器开始计时// void X0() interrupt 0 { TH0=0;//定时器清零 TL0=0; TR0=1;//开启定时器 led1=0;//点亮计时指示灯 } //外部中断1响应时,关断定时器,计算出定时时间t,并调用cos函数计算出功率因数赋给pfact,进行比较操作// void X1() interrupt 2 { TR0=0;//关断定时器0 led1=1;//熄灭计时指示灯 t=(256*TH0+TL0)/1000000; fi=100*pi*t;//计算相位差 pfact=cos(fi);//计算功率因数 if(t>0.01) //如果电流超前,补偿过量则 { relay=1;//切除电容器 led2=1;//熄灭电容器投入指示灯 } else if(t>0.005&&t<0.01)//如果电流滞后电压超过90度 { relay=0;//投入电容 led2=0;//点亮电容器投入指示灯 } else if(t<0.005) { if(pfact<0.8)//如果功率因数小于设定值 { relay=0;//投入电容 led2=0; } } } 求各位大神指点迷津,不胜感激!!另外,如果要把计算出的浮点型数据pfact在液晶上显示,怎样才能将其转换成字符型????我的qq:350429119 |
|
相关推荐
3个回答
|
|
你要清楚51单片机的能力,它虽然支持浮点数运算,但是效果很差。你可能还没算完一组数据,下一个中断又到来了,结果可想而知。所以采用别的方法来取代浮点数,例如定点数,三角函数可以用查表。编程不是生搬硬套。不是会几个数学公式就可以直接套进去的,你要考虑cpu的能力,量力而行
评分
|
||
|
||
直接用TH0,TL0查表得到功率因数不是非常快吗,直接拿它们两个数与某一个数进行比较,不就可以知道电流是超前还是滞后了?一个浮点数都不需要,就能很轻松的完成任务。
|
|
|
|
t=(256*TH0+TL0)/1000000;这是什么意思呀
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
飞凌嵌入式ElfBoard EL 1板卡-i2c与从设备通讯编程示例之i2c-tools工具使用
652 浏览 0 评论
stc15f2k60s2利用串口传输字模存储到eeprom并进行点阵显示
696 浏览 1 评论
1264 浏览 0 评论
588 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-串口通讯编程示例之串口编写程序
1190 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11595 浏览 31 评论
浏览过的版块 |
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-2 18:15 , Processed in 0.694066 second(s), Total 83, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号