磁悬浮Arduino代码.docx

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
磁悬浮Arduino代码

折腾了几天终于把这个东西搞定了。看似简单,还是有一些小技巧的。主要材料:Arduino UNO主控SS495线性霍尔采集位置信息L298N驱动直径12.7mm强磁球电磁铁12V,线圈电阻10欧主要参数:PID控制,采样周期1ms,PWM频率 3921Hz,悬浮距离30mm,电流300mA筷子版的,下面是一个磁体,上面是一个小铁块,中间是一截筷子。悬浮距离比较小,但是方便进行建模和控制理论分析。?磁球版,悬浮距离很大,不容易进行理论分析。?ARDUINO 代码复制打印constint SS495_PIN = A0;??// Analog input pin that the SS495 is attached toconstint PWM_PIN=3;??// Pins 3 and 11 are connected to Timer 2.?constint SampleTime=600;constint PWM_BIAS=128;?int Setpoint=850;double Kp=1, Ki=0.001, Kd=50;?void setupCoilPWM(){??? ?// Setup the timer 2 as Phase Correct PWM, 3921 Hz.? ?pinMode(3, OUTPUT);? ?// Timer 2 register: WGM20 sets PWM phase correct mode, COM2x1 sets the PWM out to channels A and B.? ?TCCR2A = 0;? ?TCCR2A = _BV(COM2A1) | _BV(COM2B1) | _BV(WGM20);? ?// Set the prescaler to 8, the PWM freq is 16MHz/255/2/prescaler? ?TCCR2B = 0;? ?TCCR2B = _BV(CS21);}?void writeCoilPWM(uint8_t pin, int val){? ?? ?OCR2B = val;}?void PID_Compute(){??staticint lastError=0;??staticunsignedlongint lastTime=0;??staticdouble iiterm=0;???unsignedlong now,timeChange;??int input,output,error,piterm,diterm;???now = micros();??timeChange = (now - lastTime);??if(timeChange=SampleTime)??{? ? lastTime = now;?? ? input=read_input();?? ? error = -(Setpoint - input);?? ? iiterm+= (Ki * error);? ? iiterm=constrain(iiterm,-255,255);?? ? piterm=Kp * error;? ? diterm=Kd * (error - lastError)*1000/timeChange;? ? output = PWM_BIAS+(piterm + diterm);? ? output=constrain(output,0,255);? ? writeCoilPWM(PWM_PIN, output);?? ? // print the results to the serial monitor:? ? //sprintf(str,%04d,%+04d,%+04d,%+04d,%04d,error,piterm,diterm,(int)iiterm,output);? ? //Serial.println(str);? ??? ? /*Remember some variables for next time*/? ? lastError = error;? ?}}?int read_input(){??staticint last=0;??int r;??r=analogRead(SS495_PIN);??if(abs(r-last)4)? ? r=last;??else? ? last=r;??return r;}?voidsetup(){??setupCoilPWM();}?voidloop(){??// read the analog in value:??PID_Compute();}下一步准备加上串口通讯,用matlab做上位机界面。已经做好了Arduino的自平衡车和两旋翼模型,有空也放上来。完整版,用串口向PC机发

文档评论(0)

ddf55855 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档