學習目標
- 學習ISD1820語音芯片的使用方法
- 學習STM32 GPIO的輸入輸出
- 按鍵掃描功能實現
芯片特點
- 工作電壓3~5V;
- 單段錄放控制簡單;
- 帶話筒放大直通功能——可用作喊話器模塊;
- 邊沿/電平觸發放音;
- 內置8Ω喇叭驅動放大電路,即可直接驅動8歐0.5W小喇叭;
- 無需單片機參與即可實現錄放音功能;
- 取樣率和錄放音時間可以由外部振盪電阻調節。外接電阻調整錄音時間,可以實現8~20秒語音錄放。錄入的時間越短音質越好,錄入的時間越長音質越差;
振盪電阻(ROSC): 此端接振盪電阻至VSS,由振盪電阻的阻值決定錄放音的時間。
推薦應用電路:
應用場景
- 錄音喊話器
- 錄音門鈴
- 留言
- 播放固定歡迎語
封裝及引腳功能:
- 1腳爲錄音端(REC),高電平有效。只要REC變高電平(不管芯片處在節電狀態還是正在放音),芯片即開始錄音。錄音期間,REC必須保持爲高電平。REC變低電平或內存錄滿後,錄音週期結束,芯片自動寫入一個信息結束標誌(EOM),使以後的重放操作可以及時停止。
如果用戶只需要電路做放音用,可以在芯片錄好音測試無誤後,將芯片的REC端長期接地,取消REC按鍵,這樣可以防止意外抹音。
-
2腳爲邊沿觸發放音端(PLAYE),此端出現上升沿時,芯片開始放音。放音持續到EOM標誌或內存結束。開始放音後,可以釋放PLAYE。
-
3腳爲電平觸發放音端(PLAYL),此端從低電平變高電平時,芯片開始放音。放音持續至此端回到低電平,或遇到EOM標誌,或內存結束。
-
4腳爲話筒輸入端(MIC)。
-
5腳爲話筒參考端(MICREF)。
-
6腳爲自動增益控制端(AGC)。通常4.7μF的電容器在多數場合下可獲得滿意的效果。
-
7腳、9腳爲喇叭輸出端(SP+、SP-),這對輸出端可直接驅動8Ω以上的喇叭。
ISD1820能夠直接推動喇叭,但音量不是很大。如果用戶需要更大音量的輸出,可以外加集成功率放大器。
-
8腳、14腳爲地線(VSSA,VSSD),芯片內部的模擬和數字電路的不同地線匯合在這兩個引腳。
-
10腳爲振盪電阻端(ROSC),此端接振盪電阻至VSS,由振盪電阻的阻值決定錄放音的時間。
-
11腳爲電源端(VCC),芯片內部的模擬和數字電路使用的不同電源總線在此引腳匯合,這樣使得噪聲最小。去耦電容應儘量靠近芯片。
-
12腳爲直通模式端(FT),此端允許接在MIC輸入端的外部語音信號經過芯片內部的AGC電路、濾波器和喇叭驅動器而直接到達喇叭輸出端,形成話筒擴音機功能。平時FT端爲低電平,要實現直通功能,需將FT端接高電平,同時REC、PLAYE和PLAYL保持低電平。
-
13腳爲錄音指示端(/RECLED),處於錄音狀態時,此端爲低電平,可驅動LED。此外,放音遇到EOM標誌時,此端輸出一個低電平脈衝。此脈衝可用來觸發PLAYE,實現循環放音。
錄放音控制方式:
按鍵控制或者單片機IO控制;
實例分析
實現的功能
- 按下鬆開按鍵PLAYE可以邊沿觸發播放語音;
- 持續按下按鍵PLAYL可以電平觸發播放語音;
- 持續按下按鍵REC實現錄音;
以上功能實現不需要單片機參與。
- 按下鬆開按鍵REC,LED1點亮,相當於指示有錄音留言;
- 按下鬆開按鍵PLAYE,LED1熄滅,相當於指示留言已讀。
原理圖
代碼實現
- 按鍵BTN_PLAYE和BTN_REC初始化
//按鍵初始化函數
//PB12 設置成輸入
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
- 按鍵聲明
#define BTN_PLAYE GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_11)
#define BTN_REC GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_10)
#define BTN_PLAYE_PRES 1
#define BTN_REC_PRES 2
- 實現按鍵掃描函數
//按鍵處理函數
//返回按鍵值
//mode:0,不支持連續按;1,支持連續按;
//返回值:
//0,沒有任何按鍵按下
//BTN_PLAYE_PRES,BTN_PLAYE按下
//BTN_REC_PRES,BTN_REC按下
//注意此函數有響應優先級,PLAYE>REC!!
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1;//按鍵按鬆開標誌
if(mode)
key_up=1; //支持連按
if(key_up&&(BTN_PLAYE==1||BTN_REC==1))
{
delay_ms(10);//去抖動
key_up=0;
if(BTN_PLAYE==1)return BTN_PLAYE_PRES;
else if(BTN_REC==1)return BTN_REC_PRES;
}
else if(BTN_PLAYE==0&&BTN_REC==0)
{
key_up=1;
}
return 0;// 無按鍵按下
}
- LED1聲明
#define LED1 PAout(15) // PA15
- LED1初始化,根據原理圖設計,LED1爲低電平的時候,LED1亮。
//LED IO初始化
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_15);
}
- 主函數實現,實現按鍵掃描,當得到BTN_PLAYE按鍵按下後,LED1熄滅;當得到BTN_REC按鍵按下後,LED1點亮。
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
int main(void)
{
u8 key=0XFF;
uart_init(115200);
delay_init();
LED_Init();
KEY_Init();
//主循環
while(1)
{
key = KEY_Scan(0);
if(key)
{
switch(key)
{
case BTN_PLAYE_PRES:
{
LED1 = 1;
printf("BTN_PLAYE_PRES \r\n");
}
break;
case BTN_REC_PRES:
{
LED1 = 0;
printf("BTN_REC_PRES \r\n");
}
break;
}
}
delay_ms(10);
}
}
從六月份開始,每個月會製作一個畢業設計難度的DIY作品,
前期作品以模塊組合的形式搭建,降低門檻,方便大家一起跟着做;
DIY過程只在微信公衆號中分享,大家沒關注的,趕緊關注哈。
每個月時間大致安排:
- 上個月25號,公佈DIY作品名稱;
- 每月1日公佈作品功能點及所需要的功能模塊鏈接;
- 每月10日前繪製完模塊配合的線路板;
- 每月15日之前硬件搭建完畢,之後按模塊撰寫代碼,調試,隨時公衆號更新進展;
- 每月月底開源整個作品的源碼和PCB工程文件。
題目選取原則:
- 公衆號每個月20日發起投票,25號截止,票數最多的作爲下個月的DIY內容;
- 投票的備選項大家可以後臺留言給我,我會選出五種留言最多的作爲選項;
- 每個月的DIY內容儘量與上個月分享的文章有一定的相關度,起到溫故知新的作用。
有什麼想法或者建議,留言給我哈。
下個月的每月一練內容已經在公衆號中開啓投票了,感興趣請關注哈!
喜歡請關注微信公衆號:程序員小哈