電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>用Stylophone控制伺服系統(tǒng):音高檢測

用Stylophone控制伺服系統(tǒng):音高檢測

2023-07-11 | zip | 0.06 MB | 次下載 | 免費

資料介紹

描述

靈感

從一開始,我就知道我需要在我的項目中加入一個復古玩具。

第一步

收到我自己的留聲機后,我拿起隨附的公對公 3.5 毫米音頻線(以及三節(jié)不隨附的 AA 電池),用一只手將電線握在一起,另一只手將手寫筆固定在鍵盤上,從而確定輸出信號的范圍.

?
pYYBAGOrt1aAfOhhAAAmloJtT5w600.png
2 環(huán) TRS 插孔的引出線
?

由于留聲機輸出的是單聲道信號,因此我使用筆尖 (T) 作為輸入,使用套管 (S) 作為接地(順便說一下,R?? 代表環(huán))。

基本的留聲機有一個用于 3 種聲音模式的開關、一個顫音開關、一個電源開關、一個音量旋鈕和一個調(diào)諧旋鈕。我建議在最大音量和無顫音下使用配置文件 1,下面的所有結(jié)果都使用這些設置。調(diào)準時,留聲機的最低音符是 A (110Hz),最高音符是 E (329.63 Hz)。當留聲機開啟時(可以說是“預熱”),留聲機的輸出最小電壓范圍為 -1.7 V 至 -100 mV,峰值電壓范圍為 1.7 V 至 3.5 V。自 TI MSP430G2553無法讀取負電壓,如果您移動參考電壓,Uno 只能讀取負電壓,我決定使用 TI LM741 運算放大器構(gòu)建增益和轉(zhuǎn)換電路。

電路

可以構(gòu)建一個簡單的電路,將 [-2, 2] V 轉(zhuǎn)換為 [0, 4[ V 并應用增益以獲得輸出 [0, 3] V。

?
poYBAGOrt1yAWZv9AAHzYLekwfM587.png
非常相似的電路
?

可以使用來自 MSP430G2553 的 3.3V 電源和一個 10k 電位器來控制同相輸入。圖中的 R1 和 Rf 選擇為 9.1 kOhm 和 12 kOhm,以實現(xiàn) 9.1k/12k ? 3/4 增益。還選擇了較大的電阻器來限制電流量。考慮到這一點,我在 LTSpice(您可以在此處免費下載)中設計和仿真電路。

?
poYBAGOrt3uAMtgAAAgtbzJiyx4272.png
?

幸運的是,TI 為他們的許多部件提供了 SPICE 模型,這樣的精確仿真是可能的。(您可以在此處下載 LM741.mod )。模擬給出了從 [-2, 2] V 到 [0, 3.3] V 的預期偏移,所以是時候構(gòu)建電路了!

構(gòu)建電路

電路中使用的唯一部件是一個 9.1k 和 12k 歐姆電阻器、一個 0.1μ 法拉電容器、一個 10k 電位器、TI LM741、一個 3.5mm 音頻插孔和一些電線。

?
poYBAGOrt7qAP-7WAA0CDvFvZS4126.jpg
帶有電線的完整電路,可輕松連接到微處理器
?

焊接電路后,使用 +12/-12 V 直流電源和 MSP430G2553 的 3.3 V 電壓為其供電。從函數(shù)發(fā)生器提供 4 V 峰峰值的輸入正弦波產(chǎn)生了我想要看到的結(jié)果。

?
pYYBAGOrt8SAMYgoAADrsytVvE8264.bmp
綠色為輸入,黃色為輸出
?

現(xiàn)在提供來自留聲機的輸入并調(diào)整電位器偏移...

?
poYBAGOrt82AAId1AADoKRPmsdQ758.bmp
低音
?

?

?
pYYBAGOrt9qAdD9BAAEmLD-jLqY788.bmp
高度關注
?

您會注意到,根據(jù)定義,高音 (E 329.63 Hz) 比低音 (A 110 Hz) 緊湊得多。這會產(chǎn)生采樣問題,稍后將對此進行解釋。

MSP430G2553(主控)

MSP4302553的作用是對音頻信號進行采樣,發(fā)送給arduino,根據(jù)接收到的信息,驅(qū)動舵機。ADC10 和定時器 A0 設置為以 8kHz 采樣。

// Init ADC10
// Control Register 0
ADC10CTL0 = SREF_0; // Vr+ = Vcc and Vr- = Vss (default)
ADC10CTL0 += ADC10SHT_1; // 8 X ADC10CLKs
// ADC10SR: 2000 ksps (default)
// REFOUT: reference output off (default)
// REFBURST: continuous (default)
// MSC: single conversion mode (default)
// REFON: reference generator off (default)
ADC10CTL0 += ADC10ON; // ADC10 On
ADC10CTL0 += ADC10IE; // interrupt enabled
// Control Register 1
ADC10CTL1 = INCH_3; //input channel A3 (default)
ADC10CTL1 += SHS_0; // sample and hold source ADC10SC (default)
// ADC10DF: straight binary data format (default)
ADC10CTL1 += ADC10DIV_0; // Clock divider, try values and check noise
ADC10CTL1 += ADC10SSEL_0; // clock source ADC10SC
ADC10CTL1 += CONSEQ_0; // Single channel single conversion
// analog enable control register 0
ADC10AE0 = 8; // Enable A3 as ADC channel

引腳 1.4(任意)成為從機選擇并初始化 SPI

// Initialize Port 1, P1.0 LED, P1.4 SS
P1SEL &= ~(BIT0 + BIT4); // P1.0 and P1.4 GPIO
P1SEL &= ~(BIT0 + BIT4); // P1.0 and P1.4 GPIO
P1REN &= ~(BIT0 + BIT4); // P1.0 and P1.4 Resistor disabled
P1DIR |= BIT0 + BIT4; // Set P1.0 and P1.4 to output direction
P1OUT &= BIT4; // Initially set P1.4/SS high
// Port 1 SPI pins, P1.5 SCLK, P1.6 MISO, P1.7 MOSI
P1SEL |= BIT5 + BIT7 + BIT6; // Secondary Peripheral Module Function for P1.5-1.7
P1SEL2 |= BIT5 + BIT7 + BIT6; // Secondary Peripheral Module Function for P1.5-1.7
// Polarity and SCLK for SPI
UCB0CTL0 = UCCKPH + UCCKPL; // first edge: data capture, following edge: data update , SCLK inactive state High
// Initialize SPI
UCB0CTL0 |= UCMSB + UCMST + UCSYNC + UCMODE_0; // MSB first, master, 3-pin, 8-bit synchronous
UCB0CTL1 = UCSSEL_2 + UCSWRST; // SMCLK, enable SW Reset
// bit rate: SMCLK/x=SCLK
// smclk same as arduino uno (16 Mhz)
UCB0BR0 = 32; // low byte, divide by
// 4 divider or greater, 8 and 16 causes issues, 32 seems okay
UCB0BR1 = 0; // same as 1 divider, high byte
UCB0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
IFG2 &= ~UCB0RXIE; // Clear RX interrupt flag in case it was set during init
IE2 |= UCB0RXIE; // Enable USCI0 RX interrupt

端口 2 設置為使用 TA1 和 TA2 引腳創(chuàng)建 PWM 信號來控制伺服系統(tǒng)。

// Init Port 2
// setup P2.1 with Timer1_A3.TA1 and P2.4 with Timer1_A3.TA2
P2DIR |= 0x12;
P2SEL |= 0x12;
P2SEL2 = 0;

退一步,讓我們談談 SPI。

接口接口

它有很多內(nèi)容,但歸根結(jié)底是摩托羅拉在 1980 年代創(chuàng)建的通信接口規(guī)范,可用作雙向通道。主機 (MSP430G2553) 和從機 (Uno) 需要共享四條主要線路:SCLK、MISO、MOSI 和 SS。SCLK(串行時鐘)由主機生成,以便通信保持同步。MISO(Master In Slave Out)和 MOSI(Master Out Slave In 是街道的兩側(cè),指示交通行駛的方向(有時稱為 SOMI 和 SIMO)。SS(Slave Select)告訴從站何時應該收聽master, 以及何時忽略它。這允許一個 master 擁有多個 slaves 而不會導致通信錯誤。配置 SPI 有不同的方法,但我選擇的設置(如上面代碼中指定的)看起來像這樣。

?

?
pYYBAGOrt-KAMLpYAAKjTK04DJo860.png
?

該圖可在 MSP430x2xx 系列用戶指南的第 448 頁找到。

Arduino Uno(奴隸)

Arduino 證明了一個使 SPI 通信變得容易的庫,但只是為了讓 Arduino 成為主人(去圖)。

pinMode(MISO, OUTPUT);
// turn on SPI with interrupts, slave mode, msbit first
// clock idle when high, sample on falling edge of clock
SPCR = _BV(SPE) + _BV(SPIE) + _BV(CPOL) +_BV(CPHA);
/*
* SPIE - Enables the SPI interrupt when 1
* SPE - Enables the SPI when 1
* DORD - Sends data least Significant Bit First when 1, most Significant Bit first when 0
* MSTR - Sets the Arduino in master mode when 1, slave mode when 0
* CPOL - Sets the data clock to be idle when high if set to 1, idle when low if set to 0
* CPHA - Samples data on the falling edge of the data clock when 1, rising edge when 0
* SPR1 and SPR0 - Sets the SPI speed, 00 is fastest (4MHz) 11 is slowest (250KHz)
*
*/

設置只需要兩行代碼,但通信中的大部分困難在于讓 Uno 作為奴隸合作。Uno 和 MSP430G2553 均以 16Mhz 運行,但 MSP430G2553 可以通過使用較小的分頻器 (UCB0BRx) 設置波特率控制寄存器來更快地通過 SPI 進行通信。Uno 至少需要一個 4 分頻器 (4 Mhz),但我發(fā)現(xiàn)偶爾會出現(xiàn)錯誤傳輸(0x1234 變?yōu)?0x3400),直到 32 分頻器 (500 kHz)。我選擇將 MSP430G2553 作為主器件的原因之一是 ADC 采用 10 位樣本,而 Uno 只能采用 8 位樣本。這里越多越好,因為它提供了更高的分辨率,這意味著 MSP430G2553 可能能夠看到 1 mV 的差異,而 Uno 可能看不到。雖然這兩個設備之間的 SPI 一次發(fā)送 8 位,可以簡單地發(fā)送 2 組 8 位來獲取 MSP430G2553 的 10 位值。唯一的問題是確保較慢的 Arduino 不會落后。

剩下的貓頭鷹

最初的目的是在 Uno 上使用 FFT 或音調(diào)檢測庫,但這只會讓事情變得更慢。最終,由于我知道來自留聲機的信號的形狀(每個周期一個上升沿和一個下降沿),所以我采用了一種更簡單、更快速的方法。當前一個平均值小于閾值時,我只是等待最后 4 個樣本的平均值大于閾值。這告訴我我觸發(fā)了上升沿。然后我數(shù)了多久,直到再次發(fā)生這種情況并存儲起來。然后我會簡單地取最后 10 個計數(shù)/周期的中值來過濾掉任何異常值。這會瞬間發(fā)生,并允許伺服系統(tǒng)實時做出反應。

只需更改 MSP430G2553 上 PWM 信號的占空比即可移動伺服器。例如:

TA1CCR2 = 2100; TA1CCR1 = 2100;

最后的想法

我可能會嘗試改進代碼,以便稍后伺服在高頻下更加穩(wěn)定。


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1使用單片機實現(xiàn)七人表決器的程序和仿真資料免費下載
  2. 2.96 MB   |  44次下載  |  免費
  3. 2聯(lián)想E46L DAOLL6筆記本電腦圖紙
  4. 1.10 MB   |  2次下載  |  5 積分
  5. 3MATLAB繪圖合集
  6. 27.12 MB   |  2次下載  |  5 積分
  7. 4PR735,使用UCC28060的600W交錯式PFC轉(zhuǎn)換器
  8. 540.03KB   |  1次下載  |  免費
  9. 5UCC38C42 30W同步降壓轉(zhuǎn)換器參考設計
  10. 428.07KB   |  1次下載  |  免費
  11. 6DV2004S1/ES1/HS1快速充電開發(fā)系統(tǒng)
  12. 2.08MB   |  1次下載  |  免費
  13. 7模態(tài)分解合集matlab代碼
  14. 3.03 MB   |  1次下載  |  2 積分
  15. 8美的電磁爐維修手冊大全
  16. 1.56 MB   |  1次下載  |  5 積分

本月

  1. 1使用單片機實現(xiàn)七人表決器的程序和仿真資料免費下載
  2. 2.96 MB   |  44次下載  |  免費
  3. 2UC3842/3/4/5電源管理芯片中文手冊
  4. 1.75 MB   |  15次下載  |  免費
  5. 3DMT0660數(shù)字萬用表產(chǎn)品說明書
  6. 0.70 MB   |  13次下載  |  免費
  7. 4TPS54202H降壓轉(zhuǎn)換器評估模塊用戶指南
  8. 1.02MB   |  8次下載  |  免費
  9. 5STM32F101x8/STM32F101xB手冊
  10. 1.69 MB   |  8次下載  |  1 積分
  11. 6HY12P65/HY12P66數(shù)字萬用表芯片規(guī)格書
  12. 0.69 MB   |  6次下載  |  免費
  13. 7華瑞昇CR216芯片數(shù)字萬用表規(guī)格書附原理圖及校正流程方法
  14. 0.74 MB   |  6次下載  |  3 積分
  15. 8華瑞昇CR215芯片數(shù)字萬用表原理圖
  16. 0.21 MB   |  5次下載  |  3 積分

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935119次下載  |  10 積分
  3. 2開源硬件-PMP21529.1-4 開關降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設計
  4. 1.48MB  |  420061次下載  |  10 積分
  5. 3Altium DXP2002下載入口
  6. 未知  |  233084次下載  |  10 積分
  7. 4電路仿真軟件multisim 10.0免費下載
  8. 340992  |  191367次下載  |  10 積分
  9. 5十天學會AVR單片機與C語言視頻教程 下載
  10. 158M  |  183335次下載  |  10 積分
  11. 6labview8.5下載
  12. 未知  |  81581次下載  |  10 積分
  13. 7Keil工具MDK-Arm免費下載
  14. 0.02 MB  |  73807次下載  |  10 積分
  15. 8LabVIEW 8.6下載
  16. 未知  |  65987次下載  |  10 積分