您好!
我正在尝试使用 msp430f5438a 板上的麦克风录制我的语音。 在数据表中、我发现要为麦克风供电、我必须使用引脚6.4。 我的问题是、当 我通过 FET 为电路板供电时、此引脚是否会自动为 MIC 供电? 如果不是、 我应该如何配置引脚来为 MIC 供电? 在记录数据时、是否还建议使用 ADC12基准电压?
谢谢、
行
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好!
我正在尝试使用 msp430f5438a 板上的麦克风录制我的语音。 在数据表中、我发现要为麦克风供电、我必须使用引脚6.4。 我的问题是、当 我通过 FET 为电路板供电时、此引脚是否会自动为 MIC 供电? 如果不是、 我应该如何配置引脚来为 MIC 供电? 在记录数据时、是否还建议使用 ADC12基准电压?
谢谢、
行
您好、Ling、
感谢您的回答。 我实际上介绍了您分享的材料。 在用户指南中、我发现 MIC 链接在输入通道5。 我喜欢直接从通道读取数据。 我尝试编写自己的代码。 您共享的示例代码对我来说看起来很复杂。 它使用内部闪存存储器来存储我不需要用于我的目的的数据。 出于我的目的、我只需要读取数据并通过 UART 将 ADC 值发送到 PC (实际上检查 Teraterm 中的输出)。 请告诉我它是否可以执行? 或者我有误解。 如果我是正确的、请向我证明有关的信息
如何为6.4 下的 MIC 供电、或者您可以说我应该如何配置引脚(或者当我使用 FET 为电路板供电时它自动加电)?
在这种情况下、是否有针对 ADC12基准电压的建议?
我随附了我的代码、以防:
#include unsigned int void; int main (void) { WDTCTL = WDTPW + WDTHOLD; //停止 WDT REFCTL0 |= REFMSTR + REFVSEL_0 + REFON;//启用内部1.5V 基准 ADC12CTL0 = ADC12SHT0_8 + ADC12ON; //设置采样时间 ADC12CTL1 = ADC12SHP; //启用采样计时器 ADC12MCTL0 = ADC12SREF_1 + ADC12INCH_5;// ADC 输入通道 A5 = MIC ADC12IE = 0x001; // ADC12MEMO __DELAY_CYCLLES (75); //延迟以使 Ref 稳定 //基于默认 DCO 频率。 ADC12CTL0 |= ADC12ENC; while (1) { ADC12CTL0 &=~ADC12SC; ADC12CTL0 |= ADC12SC; //采样和转换开始 _bis_SR_register (LPM4_bits + GIE); //启用中断的 LPM4 __no_operation(); __no_operation(); } } #if defined (__TI_Compiler_version__)|| defined (__IAR_systems_icc_) #pragma vector=ADC12_vector __interrupt void ADC12ISR (void) #elif defined (__GNU__) void __attribute__((interrupt (ADC12_vector)))) ADC12ISR (void 编译器#error! #endif { switch (__even_in_range (ADC12IV、34)) { case 0:break; //向量0:无中断 情况2:中断; //向量2:ADC 溢出 情况4:中断; //向量4:ADC 时序溢出 情况6: //向量6:ADC12IFG0 语音= ADC12MEM0; //移动结果,IFG 被清除 _BIC_SR_REGISTER_ON_EXIT (LPM4_BITS);//退出活动 CPU 中断; 案例8:中断; //向量8:ADC12IFG1 大小写10:break; //向量10:ADC12IFG2 大小写12:break; //向量12:ADC12IFG3 case 14:break; //向量14:ADC12IFG4 情况16:中断; //向量16:ADC12IFG5 情况18:中断; //向量18:ADC12IFG6 案例20:中断; //向量20:ADC12IFG7 case 22:break; //向量22:ADC12IFG8 case 24:break; //向量24:ADC12IFG9 大小写26:break; //向量26:ADC12IFG10 case 28:break; //向量28:ADC12IFG11 case 30:break; //向量30:ADC12IFG12 大小写32:break; //向量32:ADC12IFG13 case 34:break; //向量34:ADC12IFG14 默认值:break; } }
您好!
我编写了代码从 MIC 读取数据、然后通过 UART 将其发送到 PC。 在 Tera Term 中进行观察。 但看到输出时我感到困惑。 看起来数据开始增加、在经过一定量的数据之后、数据就会变饱和。 当我讲话或发出声音时、它完全不会改变。 下面是我的代码和输出 ADC 数据。 我在这里出了什么问题? -
#include unsigned int void; volatile unsigned char volt [5]; void init_serial (void); void init_serial (void) { P5SEL |= 0xC0; //对于 TX/RX- UCA1为5.6和5.7 UCA1CTL1 |= UCSWRST; UCA1CTL1 |= UCSSEL_1; //32768Hz UCA1BR0=03; //波特率9600 UCA1BR1 = 0x00; UCA1MCTL = 0x06; //调制 SX=3,FX=0 UCA1CTL0 = 0x00; UCA1CTL1 &=~UCSWRST; //在操作模式 中} void adc_value (int); void adc_value (int adc_Data) { volatile char x=3; 伏特[3]=伏特[2]=伏特[1]=伏特[0]= 0x30; while (ADC_Data > 0) { 伏特[x]=(ADC_Data%10)| 0x30;//分隔单位数字 ADC_Data = ADC_Data/10; //剩余的数字比最后一个数字 X-; } 伏特[4]='\0'; } void Send_Serial (void); void Send_Serial (void) { volatile char i=0; while (volt [i]!='\0') { UCA1TXBUF =伏[i]; while (UCA1STAT 和 UCBUSY); i++; } UCA1TXBUF = 0x0a; while (UCA1STAT 和 UCBUSY); UCA1TXBUF = 0x0d; while (UCA1STAT 和 UCBUSY); } int main (void) { P6OUT |= BIT4; //麦克风电源 P6OUT &=~BIT4; //麦克风连接在输入通道5上 P6SEL |= BIT5; WDTCTL = WDTPW + WDTHOLD; //停止 WDT //初始化共享基准模块*/ REFCTL0 |= REFMSTR + REFVSEL_0 + REFON;//启用内部1.5V 基准 //初始化 ADC12_A */ ADC12CTL0 &=~ADC12ENC; //确保 ENC ADC12CTL0 = ADC12ON + ADC12SHT02; //设置采样时间 ADC12CTL1 = ADC12SHP + ADC12SSEL_3; //启用采样计时器 ADC12MCTL0 = ADC12INCH_5;// ADC 输入通道 A5 => MIC init_serial (); while (1) { ADC12CTL0 &=~ADC12SC; ADC12CTL0 |= ADC12SC + ADC12ENC; while (ADC12CTL1和 ADC12BUSY) __no_operation(); 语音= ADC12MEM0; ADC_Value (语音); SEND_Serial (); }
感谢你能抽出时间。
Bruce、您好!
感谢你能抽出时间。 我添加了命令、并在与 MIC 通话时获取如下数据。 即使在室温安静的情况下、我也得到了 ADC 值2048。 现在、您能否详细解释一下您在"未经请求"部分中建议的内容。 如果 您能帮助我理解录制 语音(比如普通语音)、那么这将是一个很好的设置。 在我的项目中、我实际上正在尝试录制语音以识别呼吸模式。 采样率是否应是典型语音频率范围4kHz 的两倍? 此外、您认为我应该 使用频率范围比这个更高的外部 MIC 吗?
感谢你 能抽出时间。
谢谢、
行