Hongwu's profilebbdou's heart soulPhotosBlogListsMore ![]() | Help |
bbdou's heart soul快跑的未必能贏,力战的未必得胜。凡事不必争老大,有时不能屈老二! January 29 笑看云霄飘一羽,曾经沧海慨平生惊闻一代武侠小说大师梁羽生于1月22日因病在悉尼去世的消息时,已经是四天以后。享年85岁的梁老曾被誉为新派武侠小说的开山祖师,曾几何时,抱着他的《白发魔女传》、《七剑下天山》、《萍踪侠影录》等彻夜难眠。诚如梁老自评曰:“开风气也,梁羽生,发扬光大者,金庸。”
由于很久没有阅读传统武侠了,所以当再次打开记忆中尘封已久的传统武侠,感觉一层厚厚的灰尘铺在上面。重重的勾勒一番,才略有了一些痕迹。其实我的传统小说阅读生涯是从古龙大师开始的,最初的应该是陆小凤系列,然后楚留香,欢乐英雄,七种武器,血鹦鹉等等,直到感觉厚重的友情和古大师无招胜有招的描述几乎无法再添满我对传统武侠的迷恋之时,我开始了金庸老师小说的涉猎。然而由于金老师“飞雪连天射白鹿,笑书神侠倚碧鸳”实在过于出名,过于大师级,所以对于他的小说,我看过的好像也就是诗中14本,或者还有两三本也不确定到底是不是大师所著,有大师名在书上的作品。然而看完大师以后,深深地满足之后竟然感到些许空虚。突然之间有那么一丝丝的担忧,接下来还有什么好的武侠可看呢?
这个时候,我还没有和梁老的著作有第一次亲密接触,也就在这段时期,我开始进行地毯式搜索。但是由于有心中的那层顾虑,我不敢去碰租书的地方同样占有不少空间的梁老的著作区,而是转战于一些相对出书比较少的作者,当然,收获也是不小。譬如李凉老师的诙谐幽默;温瑞安老师的气势磅礴;黄易老师的天马行空;还珠楼主的亦玄亦幻;萧逸的另类细腻;诸葛青云的香艳激情;柳残阳的血腥武派;陈青云的悲剧侠情;卧龙生的情节推理;上官鼎的屈曲离奇;慕容美的诗情画意;司马翎的清新脱俗;白羽老师的讥讽喻嘲;云中岳的超技击侠情;陆鱼的后现代武侠等等。当我经历了这么多不同风格的作品淘沙以后,由于看了电影《新仙鹤神针》,我决定看一下原著,结果一不小心,就和梁老的书结下了不解之缘,于是一口气读了他的七剑下天山,白发魔女传,塞外奇侠传,广陵剑,散花女侠,萍踪侠影录,还剑奇情录,大唐游侠传,女帝奇英传,飞凤潜龙,武林天骄,慧剑心魔等等。梁老的小说,从形式到内容,处处可见他受中国传统小说的影响,譬如用字句对仗的回目,每部小说开头例有题诗题词,内容大都涉及真实的历史人物,对历史背景亦甚为重视等等。写作手法也比较平淡朴实,大体上是中国旧传统小说的写法,一个故事告一个段落再接另一故事,虽有伏笔,论到变化的曲折离奇,则是显然较弱了。梁老的创新,是在“旧传统”上的创新,不脱其“泥土气息”。虽然若按“出道”的先后来说,应是先梁后金,而且诚如梁老自评,他的书更具有开风辟气之能。然而诚然我的阅读顺序和大多人看书有点本末倒置, 但是对于我个人来说,在“博览群侠”以后,再饷读梁老的传统之作,恰如其分的回归到传统武侠的传统之中,也算是一种缘分。因为那时我对于武侠小说的情节和套路不能说是了若指掌,也算是了然于胸。然而梁老的著作不以情节见长,而是以一种厚重,朴实的传统气息吸引了我。使我感到一种阅读境界上的提升,也算是一饮一啄啊!还有一个让我难以忘怀的部分就是梁老对于爱情的描写。说实话我看书的时候不喜悲剧结尾,往往过于融入,总希望最后神仙侠侣,侠骨柔情,有情人终成眷属。但是梁老对于悲剧爱情的描写,虽然我对于最后的结局也是深感难以释怀,但是他的描写,却又让人无话可说。尤以《白发魔女传》与《云海玉弓缘》这两部小说让人难忘。《白发魔女传》中的玉罗刹与卓一航,一个刚强,一个柔懦,两人都是专心一意的恋慕对方,但是在经过许多磨难之后,终于还是不能不悄然分手。虽然也还有刻骨铭心的相思,而这悲剧的结局已是无可挽回了。已故老词人刘伯端读他这部小说之后,曾写一首《踏沙行》词赠他,词道:“家国飘零,江山轻别,英雄儿女真双绝。玉萧吹到断肠时,眼中有泪都成血。郎意难坚,侬情自热,红颜未老头先雪。想君亦是过来人,笔端如灿莲花舌。”这“郎意难坚,侬情自热,红颜未老头先雪”三句,就概括的点出了悲剧的症结。
虽然有千言万语,但是不得不说,江湖又多了一分寂寞。曾几何时,梁古金三足鼎立,群雄逐鹿,传统武侠一片繁荣昌盛。再回首,梁古驾鹤踏歌西游去。这里以《萍踪侠影录》里梁老题给张丹枫的一句诗,献上对梁老的敬意“莫道萍踪随水逝,永存侠影在心田”! January 21 祝你幸福!萧敬滕的新歌(其实我也不是很确定,偶然听到,对于我来说,没有听过的歌我就命名为新歌)。听着感觉还不错,觉得词也写得蛮好的。
萧敬腾 - 祝你幸福 作词:林煌坤 作曲:林家庆
送你一份爱的礼物
我祝你幸福
不论你在何时 或是在何处
莫忘了我的祝福
人生的旅途有甘有苦
要有坚强意志
发挥你的智慧
留下你的汗珠
创造你的幸福
送你一份爱的礼物
我祝你幸福
不论你在何时 或是在何处
莫忘了我的祝福
人生的旅途有甘有苦
要有坚强意志
发挥你的智慧
留下你的汗珠
创造你的幸福
人生的旅途有甘有苦
要有坚强意志
发挥你的智慧
留下你的汗珠
创造你的幸福 January 08 随心所欲!不知不觉间离上次更新已经小有一段时间,感觉每每想写点东西的时候,要么太晚要睡了,要么突然打个岔就过去了。今天下课,顺便来图书馆借本书,更新一下自己的博客,以免过于荒芜。
先大概说说圣诞和新年假期吧。这是我来美三个年头最幸福,最充实的一个假期了吧。当然,这主要是女友“舍命”相陪的结果。一晃第三次在美国过新年了。感叹时光飞逝的同时,不知不觉间又向人生的高峰迈进一步了。圣诞那天携女友一起去了老板家,玩得挺开心的。吃的也还不错,不过自己太懒了,没有准备吃的。剩下的就是参加聚会,吃饭,打牌,当然还有我们两人一起做好吃的了。这还是来美第一次放假完全放松,以前的时候无聊就去lab工作了。
接下来就是新学期了,这个学期修了一门统计的课,是讲ANOVA的,刚上完第一节,感觉可能自己刚学完一门生物统计,所以觉得老师讲的很是罗嗦。说不清老师是哪国人,但是是亚洲面孔,说话速度挺快。老师尝试讲笑话,但是感觉地下同学不怎么笑,可能大多是女生缘故吧。虽然听说这个老师比较push,但是根绝课程安排来看问题应该不大。继续修6个学分的学位学分,还有1个学分的seminar。本来还想修CMU的Maching learning,但是被告知已经满了,那就算了。有兴趣就再修一门,不然就这样也可以了。反正这个学期还有NSF的site visit,3月份还有一忙呢。
科研方面最近先把test的那篇文章写完,然后就要重新开始调试系统了,本来还指望着ben和garrett可以把硬件系统优化完了再调试,但是现在看来如果等他们就真的“没完没了”了。还有就是搭建另一个平台调试USB输入和WiFi模块了。其实这周本来想搭好,结果发现lab用的PSU都是DELL的电脑上的,竟然不能通用,赶紧下了个PO,订了两个atx的PSU,希望明天可以到吧。
最近也和女友一起看了几部电影,首推“serendipity”了,虽然是老电影,但是一直没看过,这次和女友一起看,感觉很有意思,说句洋话就是“很有feel”:)
感觉“鹰眼”也还不错,但是稍微有些没看懂。
好了,乱七八糟写了一堆,感觉没有写得欲望了,就草草收尾吧! December 18 期末总结!随着今天上午Basic Science of Care的期末考试结束,这个学期算是尘埃落定了。今天的考试虽然是开卷,但是还真是不容易,我和Nahom一起做的,都做了3个多小时。主要是问题还是太偏医了,问了很多临床上的问题,对于我们两个engineer来说,还真是个不小的挑战。不过这个课不算学分,因此也不是那么有压力,之所以认真答题也就是为了一个“Honor”。既然说到这个课,那就先说说这个课吧。The Basic Science of Care course has been designed as a shared learning experience to guide students in learning that (1) the delivery of excellent medical care requires an interdisciplinary approach; (2) professionalism includes the personal obligation of all health care professionals to work together to remove the barriers to the delivery of safe, effective, and evidence-based care; (3) the health care delivery system is buffeted by many structural, economic, and cost constraints that can confound decision making and inhibit the provision of excellent, efficient care; (4) information systems play an essential role in improving and delivering cost-effective, error-free medical care; and (5) there are many barriers in the current health-care environment to the delivery of safe, effective, evidence-based care, and only with awareness of these problems can they be remedied. 我当时选的目的一是想体验一下医学院学生课程,其次想比较一下医学临床和我们学科临床的区别,最后就是看能不能在医学院认识几个朋友,回头如果有问题方便请教。但是最后看来,目的一是达到了,但是由于这课是医学院二年级必修课,所以上课人很多,再加上课程本身不算学分,大家重视程度迥然不同,上课的时候很多人都在做别的事情。不过小组讨论的时候很多同学还是很积极的。目的二基本没有达到,因为这个课程定位是二年级医学院学生,所以基本上整个课程覆盖的话题比较多,但是对于非医学院学生就比较tough,听到最多的就是现在的医疗系统是如何恐怖,死人无数啊!目的三也是基本没有达到,课程太大了,而且基本上其他人之间都互相认识,所以上了一学期课也就和那么两三个人说过话,一个朋友都没认识。倒是和Nahom每次下课后悔一起吃午饭,感情越来越铁了:)
至于另外一门Biostatistics,毫无悬念的得了A+,之所以这么“嚣张”,一是因为自己确实很有兴趣,二是上课的老师是CMU CS毕业,比较喜欢数学好的,我感觉。当然我的课堂表现以及作业,porject也都做得很好,综合种种因素,才得这个结果。
至于Doctor Seminar,已经上过5个学期了,完全是老鸟了,很是轻松。再加上Dr. Knootz对我还算青睐有加,这课其实对我来说也没什么压力。不过比较汗颜的是竟然有三次课都让我给忘了,后来还专门补了两次,不过补的同时帮她申了两篇文章,还算收获颇丰。
至于学位学分,老板还是老习惯,等你修到18个学分一起给了。
科研方面,这个学期最大的成就就是总算NIH RO3结题了,虽然控制器问题还是不少,但是总算采了一些数据,做了一些实验,
把解题报告顺利完成了。顺带写了一篇IEEE TRANS on NSE,希望可以被接受吧。 接下来又要准备NSF Site Visit了,所以希望假期把wheelchair test得文章赶出来,新学期开始以后就可以好好准备了。 December 16 跑了第一次长途!兼长途无敌三式!开张开张,虽然没有什么噱头,但是咋也不能占着坑不干活啊!虽然冬日寒冷,白雪耄耄,但是开荒这个周期性的命还是要“革”下去的!
虽然开车去踢球要30多分钟,而且要走高速,但是来回也就1个小时,所以算不上什么长途了。而且我也就开车去过两次还是三次,一次是独自,剩下还有人陪着,所以难登长途长途体验之堂。今天,12月16号,俺终于迈出了大大的一小步,有了一个较短的长途“初体验”。
话说建建同学要荣归故里,幸福的回国探亲。但是由于过于乐观的估计了火车票的形式,所以没有买到从匹兹堡去新泽西的车票。然而要和女友会师泽西,因此不得不买票于咋们宾州的首府--哈里斯伯格(Harrisburgh)!
于是我就接受了这个神圣的使命,送他去车站,然后把他的车给开回来。当然去的路上是建建同学这个老司机开了。匹兹堡附近天气还可以,越往东天气越差,到目的地的时候雪都已经到了“乱雪渐欲迷人眼”的境界了。虽然去的路上辛苦的警察同志埋伏在四,五个不同的地点监护着我们的安全,但是在建建老道的经验之下,被一一化解。由于旨在俺自己的初体验,所以在此不做详述,如有兴趣,静等建建同志回来后我们联系安排一个meeting做个精彩汇报:)
话说送走建建后,先设定GPS为家里地址,然后计划中间路上加油稍作休息。然而菜鸟终究是菜鸟,俺在上81以后,应该从5B出去,结果走了5A,这个是相反方向啊!于是赶紧找了一个可以U turn的地方转过去。当时的天气已经上升了一个层次,到了“浅雪已能没轮迹”,所以挑战和压力是可想而知的。再加上建建的车方向盘远没有altima得那么stiff,同时他的车闸比较硬,所以这么一小段路,俺买的可乐已经在车上完成好几个高难度的地板动作了。言归正传,转到正确方向以后,终于开到76的入口处,然而拿到票以后一个小小的不注意,俺又一次走错方向了,没有走76W而走上了76E的ramp,这下可比刚才悲惨多了,被迫背道而驰到下一个出口处,交了75 cents,然后再次调整方向。屋漏偏逢连日雨,这个时候伟大的GPS再次显示了强大的误导作用,七拐八转的我都不知道要去哪里了,正好路过一个加油站,于是决定让自己和GPS都冷静一下,加个油再说。其间想喝口可乐,想不到兴奋的可乐在车上前空翻,侧空翻以及后空翻之后,仍然后劲十足,泉涌般喷到俺的衣服上,怎一个郁闷了得啊!想不到加油站的pump也要趁火打劫,半天不work,在与收银员简单交涉以后,俺终于人品爆发,成功加完油。这个油站的油价是$1.62 per gallon,窃喜:)
冷静后的GPS果然给出和刚才完全相反的指令,原来刚才让我走那多,只是为了一个turn,于是找了个最近的路口右转进去,再左转出来。这次吸取教训,利用今天学习的第一条原则,算是在没有走冤枉路了。这条宝殿就是:欲练神功,挥刀自宫。哈哈,你真的照样做了,那不好意思,你只好去泰国发展了:)俺的意思其实是要用GPS,一定不要完全听任GPS,还是要自己看看路牌和出口,这样既可以保证没有走错,同时也可以锻炼以后没有GPS的情况下开车。
成功上到76W以后,剩下的就相对简单了,因为只需要专心开车就是了,但是一定要注意,只是相对简单,不然第二条宝典岂不是英雄无用武之地了么。第二条宝典是什么?啊,我还没说啊,各位看官见谅。这第二条宝典就是“即使自宫,未必成功”。什么,泰国有人吐血了,不对啊,那边的奶粉没有三聚氰胺啊!为什么第二条宝典是这样呢?很简单啊,上了76W,风大雪大能见度低,但是大家都开得飞快,既要保持速度,又要注意安全,还要时刻堤防着藏在某个角落的警察叔叔或阿姨。所以要保持安全车距,打开头灯(好几个车都没开灯,很不好的习惯),规范驾驶,至于速度么,俺今天基本保持在70-75之间,当然有一段限速55的地方,俺发现开到65都已经很难操控了,因此按就降到60,安全第一啊!至于警察,可能天气实在太差,俺只遇到两个,第一个把俺稍微吓了一下,因为当时俺正在超一辆18轮,速度是75吧。看到警车,我觉得刹车肯定太不安全了,于是松了一下油门,速度保持在70-71之间,还好,警车没有任何动静。至于第二辆,俺当时跟着车流,大家都是74,75的样子,我也提早看到警车了,所以比较坦然地经过。
还有没有第三条宝典么?有,当然有了,那就是“不用自宫,也能成功”。好了,俺不能详细说了,因为按感觉到危险的气息在靠拢,风紧扯乎!俺最近要避避了,最好给俺介绍一个人要不得入内的地方。各位看官不好意思,您就自己揣摩这第三条宝典吧。只要您把这三条宝典融会贯通,保证你所向披靡,天下无敌。
闪了...... December 07 Go! Steelers!本来打算封笔一段时间来着,但是看着这样的比赛,实在无法再无动于衷了!
建议今年steelers的球迷如果有心脏病,最好不要看live了,尤其是最近这两场:上场的对new england和这场cow boy,太跌宕起伏了!太高潮迭起了!太不可思议了!太震撼人心了!太什么我也不知道该怎么说了,只是觉得这种颤抖着双手打字的快感真的无法压抑的喷流出来!很久没有再看体育节目的时候这么激动了!虽然我们经常会安慰自己过程很重要,但是对于我这个球迷来说,我看重过程,但是我更在乎结果!在充满竞争的体育界,其实各行各业也都差不多了,成王败寇的潜规则总是在那赤裸裸的存在着。
恭喜steeler!虽然在前三节让我充满了失望,但是最后一节的惊艳反击是如此的动人心魄,也许这就是体育的魅力所在吧!
前进steeler!虽然进攻端还是那么差强人意,但是努力和不放弃足以让我们球迷心为满足,也许这就是球迷的乐之所在吧!
心情终于略显平复了!然而,有些东西,我想已经深深的注入心脏中了!Good game! Thank your guys! September 17 Replace headlight bulb for my 97 nissan altimafollowing these instructions then you will get it done: 1. Open the vehicles hood and secure it. 2. To gain access to the headlamp socket, you must remove the coolant resvoir (on the passenger's side) or the battery (on the drivers side). 3. The ring is located about 8 inches from either end of the car. Twist and it should unlock. Unfasten the ring and remove the socket assembly. There will be a rubber gasket. There is a retaining clip that will fit over the lightbulb. If necessary, gently pry the socket's retaining clip over the projection on the bulb (use care not to break the clip). Pull the bulb from the socket. To Install: 4. Before installing a light bulb into the socket, ensure that all electrical contact surfaces are free of corrosion or dirt. 5. Line up the replacement headlight bulb with the socket. Firmly push the bulb onto the socket until the spring clip latches over the bulb's projections. **WARNING** DO NOT TOUCH THE GLASS WITH YOUR FINGERS! Oil from your fingers can severly shorten the life of the bulb. If necessary, wipe off any dirt or oil from the bulb with rubbing alcohol before completeing installation. 6. To ensure that the replacement bulb functions properly, activate the applicable switch to illuminate the bulb which was just replaced. 7. position the headlight bulb and secure it with the locking ring. 8. Close the car's hood. August 14 莎士比亚情诗!偶然听到,很是感动和难忘,留念:
我不敢要求一吻,
我不敢奢求一笑;
只怕你一吻一笑, 会让我变的骄傲.
不!不!在我心里,
最大的愿望就是:
吻那空气已足矣! 因它刚刚吻过你! August 12 PID算法C源代码 最近几天在调试自己的系统,开环控制的已经差不多了,试着采了一些数据,结果还算凑或。但是由于Golden Chair本身的原因以及motor已经不banlance了,所以问题还是有的。所以接下来要考虑反馈控制,当然首先要尝试的就是经典的PID算法了。先前已经用matlab仿真过了,但是直接从matlab转过来的方法不知道怎么回事一再有问题。而且仿真得到的参数要么震荡太多,收敛的很慢;要么干脆不收敛。于是谷歌和摆渡双管齐下,终于摆渡成功,找到如下的两种常见C语言PID源码,略加调试,初步工作正常。备注:我主要用的方法二,但是也结合了方法一的一些思路。在此一并谢过。 方法一:通用pid算法实现(c程序) #include <stdio.h>
#include<math.h> struct _pid { int pv; /*integer that contains the process value*/ int sp; /*integer that contains the set point*/ float integral; float pgain; float igain; float dgain; int deadband; int last_error; }; struct _pid warm,*pid; int process_point, set_point,dead_band; float p_gain, i_gain, d_gain, integral_val,new_integ;; /*------------------------------------------------------------------------ pid_init
DESCRIPTION: This function initializes the pointers in the _pid structure to the process variable and the setpoint. *pv and *sp are integer pointers. ------------------------------------------------------------------------*/ void pid_init(struct _pid *warm, int process_point, int set_point)
{ struct _pid *pid; pid = warm; pid->pv = process_point; pid->sp = set_point; } /*------------------------------------------------------------------------ pid_tune
DESCRIPTION:Sets the proportional gain (p_gain), integral gain (i_gain), derivitive gain (d_gain), and the dead band (dead_band) of a pid control structure _pid. ------------------------------------------------------------------------*/ void pid_tune(struct _pid *pid, float p_gain, float i_gain, float d_gain, int dead_band)
{ pid->pgain = p_gain; pid->igain = i_gain; pid->dgain = d_gain; pid->deadband = dead_band; pid->integral= integral_val; pid->last_error=0; } /*------------------------------------------------------------------------ pid_setinteg
DESCRIPTION: Set a new value for the integral term of the pid equation. This is useful for setting the initial output of the pid controller at start up. ------------------------------------------------------------------------*/ void pid_setinteg(struct _pid *pid,float new_integ)
{ pid->integral = new_integ; pid->last_error = 0; } /*------------------------------------------------------------------------ pid_bumpless
DESCRIPTION: Bumpless transfer algorithim. When suddenly changing setpoints, or when restarting the PID equation after an extended pause, the derivative of the equation can cause a bump in the controller output. This function will help smooth out that bump. The process value in *pv should be the updated just before this function is used. ------------------------------------------------------------------------*/ void pid_bumpless(struct _pid *pid)
{ pid->last_error = (pid->sp)-(pid->pv); } /*------------------------------------------------------------------------ pid_calc 方法二:DESCRIPTION: Performs PID calculations for the _pid structure *a. This function uses the positional form of the pid equation, and incorporates an integral windup prevention algorithim. Rectangular integration is used, so this function must be repeated on a consistent time basis for accurate control. RETURN VALUE: The new output value for the pid loop. USAGE #include "control.h"*/ float pid_calc(struct _pid *pid) { int err; float pterm, dterm, result, ferror; err = (pid->sp) - (pid->pv); if (abs(err) > pid->deadband) { ferror = (float) err; /*do integer to float conversion only once*/ pterm = pid->pgain * ferror; if (pterm > 100 || pterm < -100) { pid->integral = 0.0; } else { pid->integral += pid->igain * ferror; if (pid->integral > 100.0) { pid->integral = 100.0; } else if (pid->integral < 0.0) pid->integral = 0.0; } dterm = ((float)(err - pid->last_error)) * pid->dgain; result = pterm + pid->integral + dterm; } else result = pid->integral; pid->last_error = err; return (result); } void main(void) { float display_value; int count=0; pid = &warm; // printf("Enter the values of Process point, Set point, P gain, I gain, D gain \n"); // scanf("%d%d%f%f%f", &process_point, &set_point, &p_gain, &i_gain, &d_gain) process_point = 30; set_point = 40; p_gain = (float)(5.2); i_gain = (float)(0.77); d_gain = (float)(0.18); dead_band = 2; integral_val =(float)(0.01); printf("The values of Process point, Set point, P gain, I gain, D gain \n"); printf(" %6d %6d %4f %4f %4f\n", process_point, set_point, p_gain, i_gain, d_gain); printf("Enter the values of Process point\n"); while(count<=20) { scanf("%d",&process_point); pid_init(&warm, process_point, set_point); pid_tune(&warm, p_gain,i_gain,d_gain,dead_band); pid_setinteg(&warm,0.0); //pid_setinteg(&warm,30.0); //Get input value for process point pid_bumpless(&warm); // how to display output display_value = pid_calc(&warm); printf("%f\n", display_value); //printf("\n%f%f%f%f",warm.pv,warm.sp,warm.igain,warm.dgain); count++; } } /*====================================================================================================
这是从网上找来的一个比较典型的PID处理程序,在使用单片机作为控制cpu时,请稍作简化,具体的PID参数必须由具体对象通过实验确定。由于单片机的处理速度和ram资源的限制,一般不采用浮点数运算,而将所有参数全部用整数,运算到最后再除以一个2的N次方数据(相当于移位),作类似定点数运算,可大大提高运算速度,根据控制精度的不同要求,当精度要求很高时,注意保留移位引起的“余数”,做好余数补偿。这个程序只是一般常用pid算法的基本架构,没有包含输入输出处理部分。 =====================================================================================================*/ #include <string.h> #include <stdio.h> /*==================================================================================================== PID Function The PID (比例、积分、微分) function is used in mainly control applications. PIDCalc performs one iteration of the PID algorithm. While the PID function works, main is just a dummy program showing a typical usage.
=====================================================================================================*/ typedef struct PID {
double SetPoint; // 设定目标 Desired Value
double Proportion; // 比例常数 Proportional Const
double Integral; // 积分常数 Integral Const double Derivative; // 微分常数 Derivative Const double LastError; // Error[-1]
double PrevError; // Error[-2] double SumError; // Sums of Errors } PID;
/*====================================================================================================
PID计算部分 =====================================================================================================*/ double PIDCalc( 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 // 微分项 ); } /*====================================================================================================
Initialize PID Structure =====================================================================================================*/ void PIDInit (PID *pp)
{ memset ( pp,0,sizeof(PID)); } /*====================================================================================================
Main Program =====================================================================================================*/ double sensor (void) // Dummy Sensor Function
{ return 100.0; } void actuator(double rDelta) // Dummy Actuator Function
{} void main(void)
{ PID sPID; // PID Control Structure double rOut; // PID Response (Output) double rIn; // PID Feedback (Input) PIDInit ( &sPID ); // Initialize Structure
sPID.Proportion = 0.5; // Set PID Coefficients sPID.Integral = 0.5; sPID.Derivative = 0.0; sPID.SetPoint = 100.0; // Set PID Setpoint for (;;) { // Mock Up of PID Processing
rIn = sensor (); // Read Input
rOut = PIDCalc ( &sPID,rIn ); // Perform PID Interation actuator ( rOut ); // Effect Needed Changes } } 补记来美两周年! 8月9号,两年前的这一天,我告别了父母家人,离开了祖国,来到美国这片陌生而又熟悉的土地。这天同时是我第一次坐飞机,第一次这么远离父母并且来到一个完全没有亲人和朋友的地方。 时光如箭,岁月如梭,眨眼间已经来到美国两年了。平日的点滴还好都断续的记录在自己这片小小的土地上,不然该是很大的遗憾了。其实一直规划着写《我的童年》,《我的交大十年》,但是腹稿良久,却总是缺乏执笔的决心,不知不觉间有些片段已经变得略显模糊了。庆幸的是不时的回忆和思考使得没有被完全抹去。其实这也是自己一直以来没有停止更新自己博客的原因,现在以前偶尔记的日记估计已经找不到了,高中写的那个诗集也不知道还在家中某个角落否。虽然说人生要不断向前,但是如果没有过往的那些回忆,一位向前只会自我迷失,毕竟我们始终需要一个参考,来体现自己的个人价值。如果不屑于或者不堪用平行的参考点或者旁人的事迹,那么自己的过去就是自己不断更新的一个动态参考点了。人生何尝不是一个复杂的feedback + feed forward 的系统啊! 罗罗嗦嗦又扯了不少,其实只是想记下来自己两年后的8月9号怎么度过的,之所以想记下来,也只是因为觉得今年还算特别一些。去年那日此城中,人境依旧忆已穷了。今年其实是在醉生梦死中度过的,8月8号晚上去中国教会呆了一会,然后经理(一个台湾朋友的昵称)打电话请去她家喝酒,其实我是知道她和她的美国小男友分手了,所以就答应了。建建(前室友)从东北带过来一瓶榆树钱,很烈的酒。刚开始就我们三人,后来Stan和Iris(台湾朋友)也一起过来了,他们都住在经理这栋楼,所以大家也都放开喝了。但是他们貌似不怎么喜欢和国产白酒,所以多是喝威士忌,我对威士忌和伏特加实在提不起兴趣,所以对于香美可口的国酒自然赞不绝口,结果可以想象,一瓶刚开封的酒被我喝得就剩一个瓶底了,当然后果也是惨烈的--醉倒在经理那里,也就睡在她那里了。第二天才知道昨天竟然喝到了2点半。建建,stan还所有Iris走的时候我都不知道了。 第二天早上醒来还是有些宿醉,stan其实晚上已经帮我泡了些茶,但是貌似作用不大。经理帮我泡了一杯蜂蜜红糖水,然后就一直休息。直道11点多洗个澡才算舒坦一些,还好的就是白酒宿醉不像啤酒那么难受,至少不头疼。后来经理正在洗澡,她的朋友Doris来了,敲门以后我去开门,她很是吃惊,以为走错了呢。赶紧告诉她经理在洗澡,让她稍等一下。她的神经好大条啊·!后来聊天和一起吃饺子的时候发现她真的好幼稚天真(谢谢建建辛苦买的饺子)。 吃过之后先是一起把经理的车送修,她的车窗上不去了,同时也要车检。然后和建建陪着她去给她看电脑,逛了一下午,开了100迈,不过最后也没有看到合适的电脑。回到家都已经9点多了。新室友还在整理她的东西,房子还是比较乱。 BTW:总算和室友的那只狗建立了一丝感情,刚开始的时候我真害怕啊! |
|
||||||||||||||||||
|
|