音频校音器之9-结题
1、按照音频校音器的计划,需要采用快速傅里叶变换的点位和按照大量的矩阵计算。不过在程序设计的过程中,多次发现定义中间数据时就出现错误,参照手册的参数如下:“CH554 支持最高 24MHz 系统主频,内置 16K 程序存储器 ROM 和 256 字节内部 iRAM 以及 1K 字节 片内 xRAM,xRAM 支持 DMA 直接内存存取。”也就是内存最大1K字节,按照FFT的计算,128点需要至少128点x2字节x2的内存。这样在内存计算是需要非常精细的容量分配,而小于128点的采样基本上就不能捕捉到有效的采样点了。经测试,选择32点的变量定义还是可以通过编译的,但是没有测试计算结果如何。
如果确实需要这样大量计算,就需要把数据存入数据区,用数据区来计算,这样的程序复杂性和运算速度是可想而知的。因为很多芯片,FFT是用专门的库函数,或者DSP库直接计算的,因此降低计算量可以实现模拟,但是最高2kHz的程序是不能完成正确完成测试的。
所以,DIY的项目选择并不合适。
2、不过,经过极限测试,可以发现,这个CH554是非常优秀的芯片。仅就24MHz的主频来说,就已经超过MSP430 valueline的16MHz(当然这个是16位的)。因此,很多适当计算量的任务都是可以胜任的。同时,包括I2C,SPI和UART的通讯协议更是可以在小家电和基本的电机PWM控制上充分满足要求。
至于USB更是亮度,对于USB外设开发是最合适的选择,这个在上述的评测中都体现出了的。不过,不宜把全部的端口都使用起来,如touchkey+USB的编译后已经达到了9k的容量,对于16k的程序区,用户定制的功能部分,就需要更完善和巧妙的程序设计。
3. 在本项目的开发中,完成了一半的工作。
主要就是启动time,设定timer0计时,时钟中断启动ADC转换,把采样的数据输出出来。这个主要的部分写在了time.c的时钟0的中断响应程序中,
- UINT16 adcfft(UINT8 dotcount)
- {
- UINT16 ich=0;
-
- dotcount++;
- //printf("start addfft ...\n");
- //printf("AIN%02x ",(UINT16)ich);
-
-
- ADC_ChannelSelect( ich ); //ADC?????
- ADC_START = 1; //????,????????
- while(ADC_START); //ADC_START??0?,??????
- printf("DATA: %08x\n",(UINT16)ADC_DATA);
- //mDelaymS(100);
- }
- #ifdef T0_INT
- /*******************************************************************************
- * Function Name : mTimer0Interrupt()
- * Description :
- *******************************************************************************/
- void mTimer0Interrupt( void ) interrupt INT_NO_TMR0 using 1 //timer0ÖD¶Ï·tÎñ3ìDò,ê1óüÄ′æÆ÷×é1
- { //·½ê½3ê±£¬TH0ê1óÃTimer1μÄÖD¶Ï×êÔ′
- SCK = ~SCK;
- adcfft();
- // mTimer_x_SetData(0,0x0000);
- }
- #endif
在main.c中的有关代码
- main( )
- {
- CfgFsys( );
- mDelaymS(5);
- mInitSTDIO( );
- ADCInit( 0 );
- printf("start ...\n");
-
- ich=0; //ADC channel 0;
- #ifdef T0_INT
- // printf("T0 Test ...\n");
- mTimer0Clk12DivFsys();
- mTimer_x_ModInit(0,2);
- //mTimer_x_SetData(0,0x5555);
- mTimer_x_SetData(0,0x1770);
- mTimer0RunCTL(1);
- ET0 = 1;
- EA = 1;
-
- while(1);
- {
- };
- #endif
- }
显示的输出截屏为
另外有一种近似模拟的方式,这里设定采样频率为4kHz,最大可以捕捉2kHz的声音信号。采用捕捉模拟量最大值的时间间隔,然后进行时间计数,求倒数就是时钟频率。
在这个过程中,由于有程序运行时间的误差,因此计算的结果更不精确。因此没有继续,本示例项目为采用声音信号的数模转换部分,快速傅里叶变换部分没有进行。
4、后续工作
经过开发板的评测,已经具备使用CH554进行项目快速开发的条件,在合适的产品开发过程中,使用CH554G应该是一个不错的选择。
如果,有什么不合适的就是每次写程序和程序测试,都需要插拔USB线,而且不能同时存在,因为要占用计算机的端口。如果增加一个板载reset键+拨码的转换开关,可以不需要插拔就实现重新加电的过程,应该开发更方便。