[经验] 【新版CH554评测DIY】音频校音器之9-结题

北方   2018-5-3 15:20 楼主
音频校音器之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的中断响应程序中,
  1. UINT16 adcfft(UINT8 dotcount)
  2. {
  3.     UINT16 ich=0;
  4.        
  5.     dotcount++;
  6.    //printf("start addfft  ...\n");                
  7.                     //printf("AIN%02x ",(UINT16)ich);               
  8.        
  9.                
  10.         ADC_ChannelSelect( ich );                                                //ADC?????
  11.         ADC_START = 1;                                                         //????,????????
  12.         while(ADC_START);                                                      //ADC_START??0?,??????
  13.         printf("DATA: %08x\n",(UINT16)ADC_DATA);

  14.                                 //mDelaymS(100);
  15. }

  16. #ifdef T0_INT
  17. /*******************************************************************************
  18. * Function Name  : mTimer0Interrupt()
  19. * Description    :
  20. *******************************************************************************/
  21. void        mTimer0Interrupt( void ) interrupt INT_NO_TMR0 using 1                //timer0ÖD¶Ï·tÎñ3ìDò,ê1óüÄ′æÆ÷×é1
  22. {                                                                           //·½ê½3ê±£¬TH0ê1óÃTimer1μÄÖD¶Ï×êÔ′
  23.     SCK = ~SCK;
  24.         adcfft();

  25. //     mTimer_x_SetData(0,0x0000);
  26. }
  27. #endif

在main.c中的有关代码


  1. main( )
  2. {
  3.     CfgFsys( );
  4.     mDelaymS(5);
  5.     mInitSTDIO( );
  6.           ADCInit( 0 );  
  7.     printf("start ...\n");
  8.        
  9.                 ich=0; //ADC channel 0;
  10. #ifdef T0_INT
  11.     // printf("T0 Test ...\n");
  12.     mTimer0Clk12DivFsys();
  13.     mTimer_x_ModInit(0,2);
  14.     //mTimer_x_SetData(0,0x5555);
  15.         mTimer_x_SetData(0,0x1770);
  16.     mTimer0RunCTL(1);
  17.     ET0 = 1;
  18.     EA = 1;
  19.                          
  20.     while(1);
  21.         {  
  22.         };
  23.         #endif       
  24. }

显示的输出截屏为
捕获.JPG
另外有一种近似模拟的方式,这里设定采样频率为4kHz,最大可以捕捉2kHz的声音信号。采用捕捉模拟量最大值的时间间隔,然后进行时间计数,求倒数就是时钟频率。
在这个过程中,由于有程序运行时间的误差,因此计算的结果更不精确。因此没有继续,本示例项目为采用声音信号的数模转换部分,快速傅里叶变换部分没有进行。
4、后续工作
经过开发板的评测,已经具备使用CH554进行项目快速开发的条件,在合适的产品开发过程中,使用CH554G应该是一个不错的选择。
如果,有什么不合适的就是每次写程序和程序测试,都需要插拔USB线,而且不能同时存在,因为要占用计算机的端口。如果增加一个板载reset键+拨码的转换开关,可以不需要插拔就实现重新加电的过程,应该开发更方便。

回复评论 (2)

板子上是有download按键、reset按键和供电开关的哦,通过USB口下载的话,在不插拔USB线的情况下也是可以进入下载模式和复位芯片的。
单价1元含税的USB和Touchkey单片机CH551G已大批量出货,试样QQ:1258305301
点赞  2018-5-31 11:29
引用: 沁恒USB单片机 发表于 2018-5-31 11:29
板子上是有download按键、reset按键和供电开关的哦,通过USB口下载的话,在不插拔USB线的情况下也是可以进 ...

是这样的,不过,这个USB口做ISP一般就不会再作为UART口使用了,不能用USB-TTL的方式进行调试的。这样的设计,有方便的地方已有不好用的地方。
点赞  2018-6-1 10:12
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复