//MCU:Mega16;晶振:8MHz;
//PWM:4KHz;濾波器頻率:100Hz;系統(tǒng)頻率:100Hz;10ms;
//二輪平衡機(jī)器人項(xiàng)目
#include #include #include //#define checkbit(var,bit) (var&(0x01<<(bit))) /*定義查詢位函數(shù)*/ //#define setbit(var,bit) (var|=(0x01<<(bit))) /*定義置位函數(shù)*/ //#define clrbit(var,bit) (var&=(~(0x01<<(bit)))) /*定義清零位函數(shù)*/ //------------------------------------------------------- //輸出端口初始化 void PORT_initial(void) { DDRA=0B00000000; PINA=0X00; PORTA=0X00; DDRB=0B00000000; PINB=0X00; PORTB=0X00; DDRC=0B00010000; PINC=0X00; PORTC=0X00; DDRD=0B11110010; PIND=0X00; PORTD=0X00; } //------------------------------------------------------- //定時(shí)器1初始化 void T1_initial(void) { TCCR1A|=(1< TCCR1B|=(1< } //------------------------------------------------------- //定時(shí)器2初始化 void T2_initial(void) //T2:計(jì)數(shù)至OCR2時(shí)產(chǎn)生中斷 { OCR2=0X4E; //T2:計(jì)數(shù)20ms(0X9C)10ms(0X4E)時(shí)產(chǎn)生中斷; TIMSK|=(1< TCCR2|=(1< } //------------------------------------------------------- //外部中斷初始化 void INT_initial(void) { MCUCR|=(1< GICR|=(1< } //------------------------------------------------------- //串口初始化; void USART_initial( void ) { UBRRH = 0X00; UBRRL = 51; //f=8MHz;設(shè)置波特率:9600:51;19200:25; UCSRB = (1< UCSRC = (1< UCSRB|=(1< } //------------------------------------------------------- //串口發(fā)送數(shù)據(jù); void USART_Transmit( unsigned char data ) { while ( !( UCSRA & (1< UDR = data; //將數(shù)據(jù)放入緩沖器,發(fā)送數(shù)據(jù); } //------------------------------------------------------- //串口接收數(shù)據(jù)中斷,確定數(shù)據(jù)輸出的狀態(tài); #pragma interrupt_handler USART_Receive_Int:12 static char USART_State; void USART_Receive_Int(void) { USART_State=UDR;//USART_Receive(); } //------------------------------------------------------- //計(jì)算LH側(cè)輪速:INT0中斷; //------------------------------------------------------- static int speed_real_LH; //------------------------------------------------------- #pragma interrupt_handler SPEEDLHINT_fun:2 void SPEEDLHINT_fun(void) { if (0==(PINB&BIT(0))) { speed_real_LH-=1; } else { speed_real_LH+=1; } } //------------------------------------------------------- //計(jì)算RH側(cè)輪速,:INT1中斷; //同時(shí)將輪速信號(hào)統(tǒng)一成前進(jìn)方向了; //------------------------------------------------------- static int speed_real_RH; //------------------------------------------------------- #pragma interrupt_handler SPEEDRHINT_fun:3 void SPEEDRHINT_fun(void) { if (0==(PINB&BIT(1))) { speed_real_RH+=1; } else { speed_real_RH-=1; } } //------------------------------------------------------- //ADport采樣:10位,采樣基準(zhǔn)電壓Aref //------------------------------------------------------- static int AD_data; //------------------------------------------------------- int ADport(unsigned char port) { ADMUX=port; ADCSRA|=(1< while(!(ADCSRA&(BIT(ADIF)))); AD_data=ADCL; AD_data+=ADCH*256; AD_data-=512; return (AD_data); } //* //------------------------------------------------------- //Kalman濾波,8MHz的處理時(shí)間約1.8ms; //------------------------------------------------------- static float angle, angle_dot; //外部需要引用的變量 //------------------------------------------------------- static const float Q_angle=0.001, Q_gyro=0.003, R_angle=0.5, dt=0.01; //注意:dt的取值為kalman濾波器采樣時(shí)間; static float P[2][2] = { { 1, 0 }, { 0, 1 } }; static float Pdot[4] ={0,0,0,0}; static const char C_0 = 1; static float q_bias, angle_err, PCt_0, PCt_1, E, K_0, K_1, t_0, t_1; //------------------------------------------------------- void Kalman_Filter(float angle_m,float gyro_m) //gyro_m:gyro_measure { angle+=(gyro_m-q_bias) * dt; Pdot[0]=Q_angle - P[0][1] - P[1][0]; Pdot[1]=- P[1][1]; Pdot[2]=- P[1][1]; Pdot[3]=Q_gyro; P[0][0] += Pdot[0] * dt; P[0][1] += Pdot[1] * dt; P[1][0] += Pdot[2] * dt; P[1][1] += Pdot[3] * dt; angle_err = angle_m - angle; PCt_0 = C_0 * P[0][0]; PCt_1 = C_0 * P[1][0]; E = R_angle + C_0 * PCt_0; K_0 = PCt_0 / E; K_1 = PCt_1 / E; t_0 = PCt_0; t_1 = C_0 * P[0][1]; P[0][0] -= K_0 * t_0; P[0][1] -= K_0 * t_1; P[1][0] -= K_1 * t_0; P[1][1] -= K_1 * t_1; angle += K_0 * angle_err; q_bias += K_1 * angle_err; angle_dot = gyro_m-q_bias; } //*/ /* //------------------------------------------------------- //互補(bǔ)濾波 //------------------------------------------------------- static float angle,angle_dot; //外部需要引用的變量 //------------------------------------------------------- static float bias_cf; static const float dt=0.01; //------------------------------------------------------- void complement_filter(float angle_m_cf,float gyro_m_cf) { bias_cf*=0.998; //陀螺儀零飄低通濾波;500次均值; bias_cf+=gyro_m_cf*0.002; angle_dot=gyro_m_cf-bias_cf; angle=(angle+angle_dot*dt)*0.90+angle_m_cf*0.05; //加速度低通濾波;20次均值;按100次每秒計(jì)算,低通5Hz; } */ //------------------------------------------------------- //AD采樣; //以角度表示; //加速度計(jì):1.2V=1g=90°;滿量程:1.3V~3.7V; //陀螺儀:0.5V~4.5V=-80°~+80°;滿量程5V=200°=256=200°; //------------------------------------------------------- static float gyro,acceler; //------------------------------------------------------- void AD_calculate(void) { acceler=ADport(2)+28; //角度校正 gyro=ADport(3); acceler*=0.004069; //系數(shù)換算:2.5/(1.2*512); // 5/(1.2*1024);5為參考電壓5V;1.2V靈敏度對(duì)應(yīng)加速度1g;1024為AD精度 acceler=asin(acceler); //反正弦求角度 gyro*=0.00341; //角速度系數(shù):(3.14/180)* 100/512=0.01364;//(3.14/180)* (200*0.025)/1024*0.025既5/1024*0.025 //求得角速度 單位 角度/秒 Kalman_Filter(acceler,gyro); //卡爾曼濾波 帶入角度。角速度 //complement_filter(acceler,gyro); } //------------------------------------------------------- //PWM輸出 //------------------------------------------------------- void PWM_output (int PWM_LH,int PWM_RH) { if (PWM_LH<0) { PORTD|=BIT(6); PWM_LH*=-1; } else { PORTD&=~BIT(6); } if (PWM_LH>252) { PWM_LH=252; } if (PWM_RH<0) { PORTD|=BIT(7); PWM_RH*=-1; } else { PORTD&=~BIT(7); } if (PWM_RH>252) { PWM_RH=252; } OCR1AH=0; OCR1AL=PWM_LH; //OC1A輸出; OCR1BH=0; OCR1BL=PWM_RH; //OC1B輸出; } //------------------------------------------------------- //計(jì)算PWM輸出值 //車輛直徑:76mm; 12*64pulse/rev; 1m=3216pulses; //------------------------------------------------------- //static int speed_diff,speed_diff_all,speed_diff_adjust; //static float K_speed_P,K_speed_I; static float K_voltage,K_angle,K_angle_dot,K_position,K_position_dot; static float K_angle_AD,K_angle_dot_AD,K_position_AD,K_position_dot_AD; static float position,position_dot; static float position_dot_filter; static float PWM; static int speed_output_LH,speed_output_RH; static int Turn_Need,Speed_Need; //------------------------------------------------------- void PWM_calculate(void) { if ( 0==(~PINA&BIT(1)) ) //左轉(zhuǎn) { Turn_Need=-40; } else if ( 0==(~PINB&BIT(2)) ) //右轉(zhuǎn) { Turn_Need=40; } else //不轉(zhuǎn) { Turn_Need=0; } if ( 0==(~PINC&BIT(0)) ) //前進(jìn) { Speed_Need=-2; } else if ( 0==(~PINC&BIT(1)) ) //后退 { Speed_Need=2; } else //不動(dòng) { Speed_Need=0; } K_angle_AD=ADport(4)*0.007; K_angle_dot_AD=ADport(5)*0.007; K_position_AD=ADport(6)*0.007; K_position_dot_AD=ADport(7)*0.007; position_dot=PWM*0.04; position_dot_filter*=0.9; //車輪速度濾波 position_dot_filter+=position_dot*0.1; position+=position_dot_filter; //position+=position_dot; position+=Speed_Need; if (position<-768) //防止位置誤差過大導(dǎo)致的不穩(wěn)定 { position=-768; } else if (position>768) { position=768; } PWM = K_angle*angle *K_angle_AD + K_angle_dot*angle_dot *K_angle_dot_AD + K_position*position *K_position_AD + K_position_dot*position_dot_filter *K_position_dot_AD; speed_output_RH = PWM;// - Turn_Need; speed_output_LH = - PWM;// - Turn_Need ; /* speed_diff=speed_real_RH-speed_real_LH; //左右輪速差PI控制; speed_diff_all+=speed_diff; speed_diff_adjust=(K_speed_P*speed_diff+K_speed_I*speed_diff_all)/2; */ PWM_output (speed_output_LH,speed_output_RH); } //------------------------------------------------------- //定時(shí)器2中斷處理 //------------------------------------------------------- static unsigned char temp; //------------------------------------------------------- #pragma interrupt_handler T2INT_fun:4 void T2INT_fun(void) { AD_calculate(); PWM_calculate(); if(temp>=4) //10ms即中斷;每秒計(jì)算:100/4=25次; { if (USART_State==0X30) //ASCII碼:0X30代表字符'0' { USART_Transmit(angle*57.3+128); USART_Transmit(angle_dot*57.3+128); USART_Transmit(128); } else if(USART_State==0X31) //ASCII碼:0X30代表字符'1' { USART_Transmit(speed_output_LH+128); USART_Transmit(speed_output_RH+128); USART_Transmit(128); } else if(USART_State==0X32) //ASCII碼:0X30代表字符'2'
上一篇:AVR單片機(jī)經(jīng)典使用經(jīng)驗(yàn)
下一篇:ATMEGA16L實(shí)現(xiàn)時(shí)間和溫度的循環(huán)顯示程序分享
推薦閱讀
史海拾趣
隨著市場競爭的加劇,達(dá)方電子意識(shí)到單一產(chǎn)品線的風(fēng)險(xiǎn)。因此,公司開始實(shí)施多元化戰(zhàn)略,逐步拓展至電源元件、整合通訊元件等領(lǐng)域。通過多元化戰(zhàn)略的實(shí)施,達(dá)方電子成功降低了經(jīng)營風(fēng)險(xiǎn),并為公司帶來了新的增長點(diǎn)。
面對(duì)日益嚴(yán)峻的環(huán)境問題,達(dá)方電子積極響應(yīng)國家號(hào)召,將綠色發(fā)展理念融入公司戰(zhàn)略。公司加大了對(duì)環(huán)保技術(shù)的研發(fā)力度,推出了多款綠色、節(jié)能的產(chǎn)品。同時(shí),達(dá)方電子還積極參與公益事業(yè),為社會(huì)做出了積極貢獻(xiàn)。這一階段的努力,不僅提升了公司的社會(huì)形象,也為公司的可持續(xù)發(fā)展奠定了堅(jiān)實(shí)基礎(chǔ)。
為了進(jìn)一步拓展業(yè)務(wù),DLI于1955年加入了知名的都福集團(tuán)(Dover Corporation)。通過這一合作,DLI獲得了更多的資金支持和市場資源,加速了公司的發(fā)展步伐。同時(shí),都福集團(tuán)也為DLI提供了更廣闊的發(fā)展平臺(tái),使其能夠接觸到更多的行業(yè)前沿技術(shù)和市場信息。
EXCELSEMI公司自創(chuàng)立之初,就致力于半導(dǎo)體技術(shù)的研發(fā)與創(chuàng)新。在早期,公司研發(fā)團(tuán)隊(duì)成功攻克了高性能半導(dǎo)體材料的生產(chǎn)技術(shù)難題,這一技術(shù)突破為公司后續(xù)的產(chǎn)品開發(fā)奠定了堅(jiān)實(shí)基礎(chǔ)。隨著技術(shù)的不斷進(jìn)步,EXCELSEMI在半導(dǎo)體芯片設(shè)計(jì)、制造和封裝等領(lǐng)域都取得了顯著成果,逐漸在市場中嶄露頭角。
在快速發(fā)展的過程中,Electronic-Bauteile Goerlitz GmbH公司非常重視企業(yè)文化和團(tuán)隊(duì)建設(shè)。公司倡導(dǎo)以人為本的管理理念,注重員工的培養(yǎng)和發(fā)展。公司定期組織各種培訓(xùn)和學(xué)習(xí)活動(dòng),提高員工的專業(yè)素質(zhì)和工作能力;同時(shí),公司還建立了完善的激勵(lì)機(jī)制和福利待遇體系,確保員工能夠全身心地投入到工作中。這些努力使得公司形成了一支高效、團(tuán)結(jié)、富有創(chuàng)新精神的團(tuán)隊(duì),為公司的發(fā)展提供了堅(jiān)實(shí)的保障。
請(qǐng)注意,以上故事均為模擬構(gòu)建,旨在展示一個(gè)電子公司可能的發(fā)展過程和相關(guān)故事。如有需要,您可以根據(jù)具體情況進(jìn)行調(diào)整和補(bǔ)充。
近年來,電子行業(yè)面臨著技術(shù)更新迅速、市場需求多變等挑戰(zhàn)。B&B公司積極應(yīng)對(duì)這些挑戰(zhàn),不斷調(diào)整和優(yōu)化產(chǎn)品結(jié)構(gòu),加強(qiáng)技術(shù)創(chuàng)新和人才培養(yǎng)。同時(shí),公司也密切關(guān)注行業(yè)動(dòng)態(tài)和市場需求變化,為未來的發(fā)展做好充分準(zhǔn)備。
這些故事雖然無法涵蓋B&B公司發(fā)展的全部細(xì)節(jié),但可以從不同側(cè)面反映出公司在電子行業(yè)中的成長軌跡和發(fā)展脈絡(luò)。作為一家在電子行業(yè)中具有一定影響力的公司,B&B公司的發(fā)展歷程無疑是一個(gè)充滿挑戰(zhàn)和機(jī)遇的過程。
用于機(jī)頂盒設(shè)計(jì)的高性能模擬開關(guān) 本帖最后由 jameswangsynnex 于 2015-3-3 20:00 編輯 隨著機(jī)頂盒的設(shè)計(jì)加入更多新興功能,如作為錄象程序的硬盤、緊湊型閃存接口和視頻點(diǎn)播 (VOD) 機(jī)器,模擬開關(guān)在這類應(yīng)用中繼續(xù)得以廣泛采用。選用正確的開關(guān),設(shè)計(jì)人員不僅能縮短產(chǎn)品面市 ...… 查看全部問答∨ |
Nucleus實(shí)時(shí)操作系統(tǒng)分析報(bào)告 Nucleus實(shí)時(shí)操作系統(tǒng)分析報(bào)告 Nucleus實(shí)時(shí)操作系統(tǒng)是Accelerater Technology公司開發(fā)的嵌入式RTOS產(chǎn)品,只需一次性購買Licenses,就可以獲得操作系統(tǒng)的源碼。 Nucleus的特點(diǎn): 內(nèi)核和網(wǎng)絡(luò)協(xié)議都以源碼的形式提供,用戶可以根據(jù)需要修改,這是N ...… 查看全部問答∨ |
Fundamentals_of_Instrumentation_and_Measurement.pdf 寒假回家前人品爆發(fā)第二帖。 書名:Fundamentals_of_Instrumentation_and_Measurement 作者:Dominique Placko 出版社:Published in Great Britain and the United States in 2007 by ISTE Ltd 版次:第一版 總頁數(shù):555 文件格式:PDF ...… 查看全部問答∨ |
|
51單片機(jī)與上位機(jī)的串口通訊問題!!! 急急急 應(yīng)該沒什么問題的啊,就是不通訊 ! 程序如下: #include <REG52.H> #include <stdio.h> & ...… 查看全部問答∨ |
|
先講講5.0情況: 5.0內(nèi)存映射讀取文件,會(huì)有物理內(nèi)存進(jìn)行緩存,這樣重復(fù)讀取相同內(nèi)容時(shí)直接從內(nèi)存緩沖中取得,直到所有物理內(nèi)存耗盡(low_memory情況),這時(shí)5.0會(huì)一次性全部自動(dòng)釋放所有物理內(nèi)存,之后的文件讀取又要從文件去取到內(nèi)存了。這里的物 ...… 查看全部問答∨ |
cdma2000和wcdma哪個(gè)網(wǎng)絡(luò)好 本人要開始做無線通信,產(chǎn)品功能是實(shí)現(xiàn)把火車站的關(guān)于列車的乘客客票信息在火車到站時(shí)發(fā)到火車的終端上以為檢票用。以前沒做過這方面的,現(xiàn)在考慮用哪個(gè)3G 的標(biāo)準(zhǔn)好,wcdma網(wǎng)絡(luò)覆蓋有cdma覆蓋好嗎 ,還有就是穩(wěn)定性問題。雖然不是 ...… 查看全部問答∨ |
我一直有個(gè)問題不是很清楚,zigbee發(fā)送0和1數(shù)據(jù),按照MSK的來理解,0和1應(yīng)該分別對(duì)應(yīng)一個(gè)頻率,所以在RF輸出的時(shí)候頻譜應(yīng)該是在兩個(gè)地方有主峰,例如在一個(gè)channel中,以2.405G為中心,有數(shù)據(jù)發(fā)送時(shí)候應(yīng)該分別在2.405G+500K處,和2.405G-500K處有主 ...… 查看全部問答∨ |
收到MSP430 LaunchPad 開發(fā)板后,發(fā)現(xiàn)串口例程調(diào)試不通? 自從參加TI論壇的活動(dòng),獲得LaunchPad 開發(fā)板后,本想利用MSP430G2553芯片做個(gè)小控制設(shè)備。因?yàn)樾枰玫酱冢碗S便調(diào)試了一下TI提供的幾個(gè)串口例程,結(jié)果用串口調(diào)試助手調(diào)試時(shí),發(fā)現(xiàn)沒有收到發(fā)出的數(shù)據(jù),不過,那個(gè)定時(shí)器模擬串口的例子可以調(diào)通 ...… 查看全部問答∨ |
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 人形機(jī)器人馬拉松背后的思考,兆易創(chuàng)新如何賦能機(jī)器人產(chǎn)業(yè)
- 一種基于STM32的智能柜控制器設(shè)計(jì)
- 小型傾轉(zhuǎn)旋翼機(jī)的無刷直流電機(jī)驅(qū)動(dòng)器設(shè)計(jì)
- 超高速攝影機(jī)電控系統(tǒng)設(shè)計(jì)
- 基于GPS自動(dòng)授時(shí)的無線智能控制器的設(shè)計(jì)
- 基于PTR2000的無線氣象信息采集系統(tǒng)設(shè)計(jì)
- Microchip推出MEC175xB系列器件,為嵌入式控制器引入硬件 抗量子攻擊能力
- 無人飛行器機(jī)載穩(wěn)定云臺(tái)控制系統(tǒng)的設(shè)計(jì)
- 匠芯創(chuàng)推出面向具身智能高性能實(shí)時(shí)處理器M7000
- Gartner發(fā)布企業(yè)構(gòu)建智能應(yīng)用的五項(xiàng)基本原則
- TLSM系列輕觸開關(guān)為高使用率設(shè)備提供200萬次長使用壽命
- 品英Pickering公司仿真方案和測試系統(tǒng)滿足航電設(shè)備可靠性和安全性等更高要求
- RAK12039傳感器如何參與LoRaWAN水培環(huán)境監(jiān)測物聯(lián)網(wǎng)系統(tǒng)集成
- 如何添加和激活RAK12035傳感器(電容式土壤濕度傳感器)
- ?數(shù)據(jù)分析軟件imc FAMOS 2025全球同步發(fā)布
- 基于雙積分滑模控制的單移相調(diào)制(SPS)的應(yīng)用
- 場效應(yīng)管有哪些特點(diǎn)、測量方法?場效應(yīng)管是如何導(dǎo)通的
- 場效應(yīng)管和晶閘管有什么區(qū)別?場效應(yīng)管使用注意事項(xiàng)有哪些
- 場效應(yīng)管常用驅(qū)動(dòng)芯片有哪些?如何估測場效應(yīng)管放大能力
- 電視面板價(jià)格持續(xù)下跌 二季度跌幅達(dá)21%
- 爆料:小米公司終端間雙向無線充電黑科技!
- 小米收購Zifone 27.44%銷售股份 總價(jià)1.03億美元
- 格芯紐約州晶圓廠Fab 8或被實(shí)施出口管制
- 看看ESP有多重要,開車時(shí)能保你條命
- 高能量VS安全 動(dòng)力電池首難如何破解?
- 傳感器、測試和商業(yè)化:中汽中心發(fā)起環(huán)境感知技術(shù)探討
- 首席科學(xué)家“三宗罪”遭罷免,中國自動(dòng)駕駛公司內(nèi)斗再爆發(fā)!
- 三星推出史上“最小”圖像傳感器,專為全面屏設(shè)計(jì)
- 東芝擴(kuò)大其汽車以太網(wǎng)橋接IC產(chǎn)品線,推出TC9562系列