|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
請(qǐng)問各位,怎樣用PIC產(chǎn)生一個(gè)頻率線性變化連續(xù)脈波出來呢? |
| 作者:liao_43 欄目:單片機(jī) |
我想做一子程序:頻率變化為:0Hz----5kHz,,占空為50% ,只要輸入起始頻率,終止頻率,變化時(shí)間,就可以實(shí)現(xiàn)頻率的線性變化。 我想了幾個(gè)月,都沒有想出一個(gè)好方法出來. |
| 2樓: | >>參與討論 |
| 作者: martin 于 2005/10/22 12:29:00 發(fā)布:
定時(shí)中斷,中斷里將IO取反,改變定時(shí)初值來改變頻率設(shè)定。 |
|
| 3樓: | >>參與討論 |
| 作者: liao_43 于 2005/10/22 16:54:00 發(fā)布:
每個(gè)脈波周期都不同 如果用除法來算的話,在高頻時(shí),不夠時(shí)間用啊. 如果是累加時(shí)間或累減時(shí)間偏差的話,速度會(huì)快點(diǎn).但,我不知道用什么方便的方法算出那個(gè)時(shí)間偏差來. |
|
| 4樓: | >>參與討論 |
| 作者: systemchip 于 2005/10/23 0:16:00 發(fā)布:
答 你最高頻率為5KHZ,即周期為0.2MS=200微秒,占空比為50%,也即高低電平約為100微秒,你要求最低假設(shè)為1HZ,周期為1秒,高低電平各為500毫秒,你所謂的線性變化是怎么樣的?假設(shè)你用4MHZ的話,每條指令執(zhí)行為1微秒,100微秒約折合大約一百條指令,這還不能滿足你的要求嗎? |
|
| 5樓: | >>參與討論 |
| 作者: liao_43 于 2005/10/23 20:49:00 發(fā)布:
回復(fù)systemchip 在5K,4MHZ的情況下,計(jì)算半周期時(shí)間,(1000000/2)/5K,在設(shè)計(jì) 子程序時(shí),5K是要輸入的參數(shù),1000000/2=500000,需要使用三個(gè)節(jié)的除法。運(yùn)算時(shí)間肯定不止100us. * - 本貼最后修改時(shí)間:2005-10-23 21:04:32 修改者:liao_43 |
|
| 6樓: | >>參與討論 |
| 作者: fumac 于 2005/10/23 20:50:00 發(fā)布:
最好的方法是查表:)也是最簡(jiǎn)單的 |
|
| 7樓: | >>參與討論 |
| 作者: liao_43 于 2005/10/23 21:05:00 發(fā)布:
回復(fù)fumac 頻率上升或下降的斜率不同,查不了表,太多數(shù)據(jù)了。 * - 本貼最后修改時(shí)間:2005-10-23 21:11:16 修改者:liao_43 |
|
| 8樓: | >>參與討論 |
| 作者: picexpert 于 2005/10/24 17:45:00 發(fā)布:
造一下表好不? 造一下表好不? |
|
| 9樓: | >>參與討論 |
| 作者: liao_43 于 2005/10/24 22:20:00 發(fā)布:
回復(fù):picexpert 請(qǐng)教picexpert,如何造表? 我需要編寫的子程序是:輸入起始頻率(f1),終止頻率(f2),變化時(shí)間(t),就可以實(shí)現(xiàn)頻率的線性變化。起始頻率(f1) 終止頻率(f2) 變化時(shí)間(t)這三個(gè)量 都是變量,我確實(shí)想不出怎樣將所有數(shù)據(jù)羅列出來。 |
|
| 10樓: | >>參與討論 |
| 作者: picexpert 于 2005/10/25 8:31:00 發(fā)布:
PWM 如果你用的是硬件PWM,您就把你的PWM時(shí)間發(fā)生器的值做到表中(是一個(gè)遞變的值), 如: ADDWF PCL,F DT 01; DT 02; DT 03; . . . 如此下去,再查此表將定時(shí)數(shù)據(jù)取送到相關(guān)的時(shí)間發(fā)生器中如(定時(shí)器)等.如果你做的是軟PWM請(qǐng)參考應(yīng)用筆記(MICROCHIP)CN_00645A.pdf(MICROCHIP網(wǎng)上有) |
|
| 11樓: | >>參與討論 |
| 作者: picexpert 于 2005/10/25 12:04:00 發(fā)布:
你的T也是變量? 你的T也是變量? |
|
| 12樓: | >>參與討論 |
| 作者: liao_43 于 2005/10/25 23:31:00 發(fā)布:
回復(fù):picexpert 是的,不單是起始頻率(f1),終止頻率(f2)是變量,變化時(shí)間(t)也是變量. 所以就很頭痛.picexpert,sorry,公司里不能上網(wǎng),我只能晚上下班后回復(fù)你. |
|
| 13樓: | >>參與討論 |
| 作者: eeproom 于 2005/10/26 11:26:00 發(fā)布:
你做什么應(yīng)用? 看起來像電機(jī)驅(qū)動(dòng),建議還是找其他辦法,如果你的驅(qū)動(dòng)參數(shù)是可變的,查表法就需要在RAM中做好大一張表,如果固定變化參量,倒是可以固定在ROM中。我曾做過一個(gè)電機(jī)驅(qū)動(dòng),在24MHZ下最快時(shí)間為16us,極其復(fù)雜。要想辦法讓得到參數(shù)的時(shí)間最少。 |
|
| 14樓: | >>參與討論 |
| 作者: wenbilin 于 2005/10/26 13:38:00 發(fā)布:
問題好像沒講清楚?!單片機(jī)也不是萬能的! |
|
| 15樓: | >>參與討論 |
| 作者: picexpert 于 2005/10/26 17:07:00 發(fā)布:
速度不夠吧 沒搞頭,這三個(gè)做為參數(shù)只能運(yùn)算了,時(shí)間不夠用,如果可能的話可以將表做出幾個(gè)檔來,也就是說不是連續(xù)的,這樣處理一下把表放在ROM中,否則時(shí)間肯定不夠.PIC的中檔片子是跑不到24M的.你可以試一下PIC18的或DSPIC30的電機(jī)控制的,30的應(yīng)該比較好,速度也夠快了,但是量產(chǎn)要注意成本控制喲?! |
|
| 16樓: | >>參與討論 |
| 作者: liao_43 于 2005/10/26 23:12:00 發(fā)布:
速度夠了. 這是做數(shù)碼相機(jī)里的步進(jìn)馬達(dá)耐久測(cè)試.上面三個(gè)參數(shù)想通過按鍵和LCD輸入PIC里,然后啟動(dòng)步進(jìn)馬達(dá)做CW加速--CW恒速--CW減速--停止--CCW加速--CCW恒速--CCW減速--停止,耐久模式.步進(jìn)馬達(dá)的速度不是很高,我用的PIC是16F74.因?yàn)槊看文途媚J嚼锏钠鹗妓俣龋(wěn)定速度,變化時(shí)間都不同,所以就想編寫一個(gè)子程序來實(shí)現(xiàn).不過想了幾個(gè)月都沒有想出來.現(xiàn)在每次做耐久時(shí),都要改寫程序,所以很頭痛了. |
|
| 17樓: | >>參與討論 |
| 作者: picexpert 于 2005/10/27 8:29:00 發(fā)布:
回樓上 我指的是你用你的CHIP來計(jì)算三維參數(shù)時(shí)間可能不夠用,如果你的PWM 的F高一點(diǎn)的話,你的程序中又是每個(gè)T中又存在乘除運(yùn)算,速度可能不夠.象你現(xiàn)在這樣做那應(yīng)該是夠了. |
|
| 18樓: | >>參與討論 |
| 作者: eeproom 于 2005/10/27 9:00:00 發(fā)布:
你的實(shí)現(xiàn)方法有問題的 我猜就是電機(jī)驅(qū)動(dòng),要求電機(jī)從0加速到指定的速度,100周期是要不完的,我給你一個(gè)方案你試一下, //事先計(jì)算好規(guī)定加速、減速、恒速的運(yùn)轉(zhuǎn)圈數(shù),計(jì)時(shí)器的上下限值 void MotorDrive(unsigned int end_rate,unsigned int start_rate,unsigned int speedup_circle,unsigned int speeddown_circle,unsigned int speedkeep_circle) { unsigned CHAR i; unsigned CHAR j; //i,j用來計(jì)算加速,j減速計(jì)數(shù) unsigned int timer_value_buf; ...... di(); for(;;) { if(!TMRxIF) continue; MOTOR_CP=!MOTOR_CP; //驅(qū)動(dòng)一次了 TMRxIF=0; TMRx=timer_value_buf; //接下來計(jì)算下一個(gè)timer_value_buf的值 if(speedup_circle) { ..... //讓i,j去控制timer_value_buf的變化,如果走過360度,就減去speedup一次, continue; } else if(Speedkeep_circle){ ...... //這里最輕松了,只計(jì)算圈數(shù)了 continue; } else if(speeddown_circle) { ...... //相當(dāng)于加速的倒算 continue; } break; } ei(); } 這里沒有什么除法,我曾用這個(gè)方法在96周期內(nèi)實(shí)現(xiàn)1200轉(zhuǎn)x(400步/轉(zhuǎn)x2)的步進(jìn)電機(jī)驅(qū)動(dòng),還要中斷驅(qū)動(dòng)另一個(gè)電機(jī)。i,j控制加減速不用說吧。 * - 本貼最后修改時(shí)間:2005-10-27 9:06:30 修改者:eeproom |
|
| 19樓: | >>參與討論 |
| 作者: liao_43 于 2005/10/27 21:00:00 發(fā)布:
回復(fù):picexpert 我做耐久的步進(jìn)馬達(dá)是兩相的,18度一步,步進(jìn)馬達(dá)的驅(qū)動(dòng)器自己做的,集合在PIC16F74那塊控制板上,我是用橋式驅(qū)動(dòng)步進(jìn)馬達(dá)的,一共用了一個(gè)PORT口,8根數(shù)據(jù)線來控制步進(jìn)馬達(dá)的相序。所以不能用PIC里的硬體PWM來控制步進(jìn)馬達(dá)。所以每一步都要運(yùn)算,時(shí)間還是不夠。 |
|
| 20樓: | >>參與討論 |
| 作者: liao_43 于 2005/10/27 21:30:00 發(fā)布:
回復(fù):eeproom "//讓i,j去控制timer_value_buf的變化",你的意思是不是步進(jìn)馬達(dá)每轉(zhuǎn)一圈,timer_value_buf就等量減少,即每次都減去一個(gè)常量?如果是這樣的話,我覺得你那種控制方法不能控制步進(jìn)馬達(dá)線性加減速,speed=1/(T-△t*n),T是初始周期,△t是常量,n是運(yùn)轉(zhuǎn)的圈數(shù)。而且,你的加減速控制不能達(dá)到單步變化。我想實(shí)現(xiàn)的變速是,speed=speed_1+t*((speed_2-speed1)/T),speed_1是初始速度,speed_2是終止速度,T是變化時(shí)間。 |
|
| 21樓: | >>參與討論 |
| 作者: eeproom 于 2005/10/28 7:32:00 發(fā)布:
呵呵 我有特殊需要,需要計(jì)算運(yùn)轉(zhuǎn)圈數(shù)讓別的電機(jī)同步驅(qū)動(dòng),你這里不需要圈數(shù),問題就更加簡(jiǎn)單。我有說走一圈才變速嗎?實(shí)際上我在兩圈就達(dá)到需要的速度了。誰說電機(jī)加減速是線性的?找本教科書看看再說。另外你那18度一步的電機(jī)那里買來的?我出高價(jià)買幾個(gè)玩玩。 |
|
|
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |