DISPIC30f4011 的ADC設定?
|
||||
---|---|---|---|---|
初級會員
|
dispic30f4011 ADC可以使用PWM的信號驅動取樣
但是我想問說 如果我有三個ADC訊號 分別是需要依據 三個PWM1H PWM2H PWM3H來驅動 那這顆IC有這樣的能力嗎? 怎嚜設定呢?
發表於: 2009/5/24 20:41
|
|||
|
Re: 請問有關於撰寫PI控制器的範例嗎?
|
||||
---|---|---|---|---|
初級會員
|
an696 有pid得code
裡面還寫了s型軌跡規劃 很有用喔 我自己有用dsp4011寫pid位置控置 寫的很簡單 不確定是不是你要的 如果有須要可以寄給你
發表於: 2009/5/23 19:13
|
|||
|
Re: 有關馬達電流偵測
|
||||
---|---|---|---|---|
初級會員
|
真是感謝兩位大大的解說
覺的學了好多,難怪我看大家都是直接接近pic頂多加個隨藕還是放大,這兩天來測試看看測完在跟大家分享結果 ^^
發表於: 2009/5/23 19:10
|
|||
|
Re: 有關馬達電流偵測
|
||||
---|---|---|---|---|
初級會員
|
不了解為什摸 duty正中間就是平均電流
所以要取在duty正中間是要起動pwm中斷 而且中斷的點必需隨pwm的變話而變化囉 還有為何加了低通就不能控呢? 感覺加了低通再從ADC讀入數值 然後再寫各PID 應該可以控電流 跟TORQUE 小弟不才 許多東西不了解哈 希望大家給意見阿謝謝阿
發表於: 2009/5/23 4:44
|
|||
|
Re: 關於 dsPIC30F4011 QEI 問題
|
||||
---|---|---|---|---|
初級會員
|
我覺的只有一個的話
只要使用timer 的外部訊號來源 它就會自動的計數 an696(application note) 有相關的資料
發表於: 2009/5/23 4:38
|
|||
|
有關馬達電流偵測
|
||||
---|---|---|---|---|
初級會員
|
最近在研究電流回授,我在H BRIDGE 下端接一個電阻 然後將電流轉成電壓,不過我看了一下他的波形是PWM的形狀ㄟ,雖然它會隨著有沒有阻力變大變小 蛋波形還是PWM形狀 那我接近控制器的時候 不是有時候會讀到0嗎 ?就不是平均的電流
我應該加什麼電路在接近PWM呢 ? 低通濾波嗎? 有人有圖示可以跟我講解嗎 謝謝
發表於: 2009/5/22 3:05
|
|||
|
C code 如何將24bits truncated 成16bits
|
||||
---|---|---|---|---|
初級會員
|
下面是一段程式我一直不懂的是它要把24bit 變成16bits
而大於16bit的它就把它刪掉 所以第一段code它應該要判段它的最高位元的如果為負號而且它比0x8000更負的話就都設定成 0x8000但是這段敘述 if((poserror.i[1] != 0xffff) || !(poserror.b[1] & 0x80)) 怎看都不太對勁,如果我是0xffff7fff 那poserror.b[1]=7f, 那!(poserror.b[1] & 0x80)為 ture所以進去然後被設成0xffff8000;就跟想的不太一樣 有人可以解惑嗎? 這是an718的一段程式應該沒錯 總覺得我不知那裡想錯了。附件有所有程式碼 //第一段code if (poserror.b[2] & 0x80)// If position error is negative. { poserror.b[3] = 0xff; // Sign-extend to 32 bits. if((poserror.i[1] != 0xffff) || !(poserror.b[1] & 0x80)) { poserror.i[1] = 0xffff;// Limit error to 16-bit signed //integer. poserror.i[0] = 0x8000; } else; } //第二段code else // If position error is positive. { poserror.b[3] = 0x00; if((poserror.i[1] != 0x0000) || (poserror.b[1] & 0x80)) { poserror.i[1] = 0x0000; // Limit error to 16-bit // signed integer. poserror.i[0] = 0x7fff; } else; Attach file: Link only for registered users
發表於: 2009/4/13 22:25
|
|||
|
pic18f4520 APP01 V3.0 外部震蕩器 問題
|
||||
---|---|---|---|---|
初級會員
|
下述是一段程式使用timer1的外部震盪器(32767HZ)可是實際跑的時候,TMR1L根本就沒有計數,一直停留在0,想請問是因為什麼問題呢?APP01 V3.0該插的我也有插,就不懂是哪裡出錯了,有什麼設定需要修正嗎? 還是我差錯APP01 V3.0的腳位。 我有放附加的檔案,附加檔案中斷向量0x18要改成0x08。
//********************************************************** //* Ex9_1_TMR1_INT.c //* 設計一個0.5秒讓 PORTD 的 LED 所顯示的二進位數字自動加一的程式 //********************************************************** #include <p18f4520.h> //納入微控制器定義檔 #include <timers.h> //納入計時器函式庫定義檔 // 結構位元定義 #pragma config OSC=HS, BOREN=OFF, BORV = 2, PWRT=ON, WDT=OFF, LVP=OFF #define TMR1_VAL 65536-16384 // Timer1 設定為 500ms 中斷一次 //宣告函式原型 void Init_TMR1(void); void timer1_isr (void); //宣告並安排中斷執行程式記憶體位置 #pragma code high_vector=0x08 void interrupt (void) { _asm GOTO timer1_isr _endasm } #pragma code #pragma interrupt timer1_isr void timer1_isr (void) { PIR1bits.TMR1IF = 0; // 清除中斷旗標 WriteTimer1(TMR1_VAL); // 當將計數器觸發次數歸零寫入預設值 PORTD++; // 遞加PORTD } void main (void) { PORTD = 0x00; // 將PORTD清除關閉LED TRISD = 0; // 將TRISD設為0,PORTD設定為輸出 Init_TMR1(); // 初始化設定Timer1函式 INTCONbits.PEIE = 1; // 開啟周邊中斷功能 INTCONbits.GIE = 1; // 開啟全域中斷控制 while (1); // 無窮迴圈 } void Init_TMR1 (void){ OpenTimer1( TIMER_INT_ON &T1_16BIT_RW & T1_SOURCE_EXT&T1_PS_1_1 & T1_OSC1EN_ON &T1_SYNC_EXT_ON ); WriteTimer1(TMR1_VAL); // 寫入預設值 PIR1bits.TMR1IF = 0; // 清除中斷旗標 } Attach file: Link only for registered users
發表於: 2009/4/7 21:26
|
|||
|
關於Timer0中斷 pic18f4520
|
||||
---|---|---|---|---|
初級會員
|
報歉之前的問題有打錯更正
下述是根據微處理器原理與應用-C語言與PIC18微控制器這本書的範例,裡面的timer0是設定成溢位中斷,高低優先中斷關閉,中斷向量設在0x0018,但是這樣都沒辦法正確的進入中斷,如果設成0x0008便可以了,想請問為什麼會這樣呢? //********************************************************** //* Ex8_4_But_TMR0INT.c //* 程式將偵測按鍵SW3的狀態,並遞加計數的內容。 //* 利用中斷功能,當計數數值超過四次反轉燈號。 //********************************************************** #include <p18f4520.h> //納入微控制器定義檔 #include <timers.h> //納入計時器函式庫定義檔 // 結構位元定義 #pragma config OSC=HS, BOREN=OFF, BORV = 2, PWRT=ON, WDT=OFF, LVP=OFF #define OSC_CLOCK 10 // 工作時序頻率定義 #define push_no 4 //預設觸發次數 #define count_val 256-push_no //宣告函式原型 void Init_TMR0(void); void timer0_isr (void); //宣告並安排中斷執行程式記憶體位置 #pragma code low_vector=0x18 void low_interrupt (void) { _asm GOTO timer0_isr _endasm } #pragma code #pragma interruptlow timer0_isr void timer0_isr (void) { INTCONbits.TMR0IF = 0; // 清除中斷旗標 WriteTimer0(count_val); PORTD=PORTD^0xFF; // 使用運算敘述將LED燈號反轉 } void main (void) { PORTD = 0x0F;// 將PORTD設定為b'00001111' TRISD = 0; // 將TRISD設為0,PORTD設定為輸出 TRISAbits.TRISA4=1;// 將按鍵3所對應的RA4設定為輸入 Init_TMR0(); // 初始化設定Timer0函式 INTCONbits.PEIE = 1; // 開啟周邊中斷功能 INTCONbits.GIE = 1; // 開啟全域中斷控制 while (1) ; // 無窮迴圈 } void Init_TMR0 (void){ OpenTimer0(TIMER_INT_ON &T0_8BIT &T0_SOURCE_EXT &T0_EDGE_RISE &T0_PS_1_1 ); WriteTimer0(count_val); // 相當TMR0L=count_val INTCONbits.TMR0IF = 0; // 清除中斷旗標 }
發表於: 2009/4/4 2:43
|
|||
|