火辣西米秀

  • 2021-03-01
  • 回复了主题帖: 【RISC-V MCU CH32V103测评】+ TIM定时器的使用

    PFIC 这种结构的优势是什么  

  • 回复了主题帖: 如何使用Visual Studio Code进行FreeRTOS开发

    编辑器这东西,各有所爱 没有最好,适合自己

  • 回复了主题帖: 微芯滑膜观测器SMO角度估算问题

    通过测量实际系统的输入输出,可以得到给定系统内部状态的估计值

  • 2021-02-25
  • 回复了主题帖: 到底什么是感应距离传感器

    谢谢分享,涨知识了

  • 回复了主题帖: 【RISC-V MCU CH32V103测评】- 6:SD卡(SPI)

    测试的很有用心,学习了

  • 回复了主题帖: 【ST防水气压传感器LPS27HHW测评1】硬件准备和资料收集

    谢谢分享,很不错

  • 2020-12-20
  • 发表了主题帖: MSP430G2553按下按键灯亮,松开灭

    #include <msp430.h>  //按下亮,松开灭 /**  * main.c  */ int main(void) {     WDTCTL = WDTPW | WDTHOLD;    // stop watchdog timer     DCOCTL = 0;     BCSCTL1 = CALBC1_1MHZ;     DCOCTL = CALDCO_1MHZ;          P1DIR |= BIT6;     P1DIR &= ~BIT3;     P1REN |= BIT3;     while(1)     {         if(!(BIT3 & P1IN))             P1OUT |= BIT6;         else             P1OUT &= ~BIT6;     }     return 0; }8:51 2020/12/20

  • 发表了主题帖: msp430的按键实时控制LED灯

    相信玩过430的人都知道它的P1、P2口除了具有普通IO口的功能外,还具有中断功能。 所以那我们就利用它的中断功能来实现一个小项目吧! 那就是通过按键来点亮LED灯 项目大体框架 初始化相应的IO端口:比如我们要用的P1_0—–P1_3来连接按键,然后通过P6口输出.所有,我们要设置P1口的低四位为第二功能引脚,方向为输入,P6为普通引脚,方向为输出。 设置好P1端口低四位的中断触发方式,如下降沿;打开相应的中断控制位,和打开总中断。 然后编写函数,下载到电路,调试,实现。 开发板介绍 8个LED一端连在P6口上,一端与VCC相连,共阳。 四个独立按键一端分别连在P1口的低四位,一端接地。 代码 /*********主函数main************/ /************************************************************ *作者:风儿与沙 *版本:1.0 *功能:通过四个独立按键,产生外部中断,来控制4组LED发亮 *MCU:  msp430F149 *************************************************************/ #include <msp430x14x.h> #include "Config.h"      //引入开发板硬件配置文件 #include "irq_port.c"    //引入端口初始化源文件 //相关宏 #define  LED8    P6OUT #define  LED8DIR P6DIR /************************************************************* *                    主函数 *************************************************************/ void main( void ) {   // Stop watchdog timer to prevent time out reset   WDTCTL = WDTPW + WDTHOLD;    //关闭看门狗定时器   Port_init();                //端口初始化   while(1); } //********************************************************************** //  P1口中断服务程序,需要判断 //********************************************************************** #pragma vector = PORT1_VECTOR __interrupt void P1_IRQ(void) {   switch(P1IFG&0x0F)   {      case 0x01: LED8 = 0xFC;P1IFG=0x00;break;     // 引脚0对应S1中断,必须手动清标志位,点亮D1D2      case 0x02: LED8 = 0xF3;P1IFG=0x00;break;     // 引脚1对应S2中断,必须手动清标志位,点亮D3D4      case 0x04: LED8 = 0xCF;P1IFG=0x00;break;     // 引脚2对应S3中断,必须手动清标志位,点亮D5D6      case 0x08: LED8 = 0x3F;P1IFG=0x00;break;     // 引脚3对应S4中断,必须手动清标志位,点亮D7D8   } } / IQR_PORT源文件 //************************************************************************* //  初始化IO口子程序 //************************************************************************* void Port_init() {   P1SEL = 0x00;                   //P1普通IO功能   P1DIR = 0xF0;                   //P10~P13输入模式,外部电路已接上拉电阻   P1IE  = 0x0F;                   //开启P1低四位中断   P1IES = 0x0F;                   //下降沿触发中断   P1IFG = 0x00;                   //软件清零中断标志寄存器   _EINT();                        //打开总中断   LED8DIR |= 0xFF;                 //P6口输出模式   LED8  |= 0xFF;                   //先关闭所有LED } 附上局部电路图 LED 按键 搞定!

  • 发表了主题帖: MSP430 F5529的按钮控制led灯亮灭程序代码

    #include <msp430.h> int main(void) {     WDTCTL = WDTPW | WDTHOLD; //关闭看门狗     P8DIR |= BIT1;  //设置P8.1输出灯     P1DIR &=~ BIT2; //设置p1.2输入按钮     P1REN = BIT2;   //设置上拉电阻,让其更加稳定(还真是)     P8OUT &=~ BIT1; //默认关上,P1.2设置不了初始值     for(;;)     {         if(P1IN&BIT2)   //P1正的,则亮,不然就灭         {             P8OUT |= BIT1;         }         else         {             P8OUT &=~ BIT1;         }     } }

  • 发表了主题帖: MSP430F5529的智能灯设计

    #include <msp430F5529.h> void IO_Init(); void InitADC(); unsigned int  GetAD(char channel); void light_Compare(int templight); int counter=0;                          //中断计数器参数,单位秒   /**  * main.c  */   int main(void) {     IO_Init();                          //IO初始化     InitADC();                          //初始化ADC模块       int voice = 0;                      //缓存声音响度     int light = 0;                      //缓存环境亮度       WDTCTL = WDT_ADLY_1000;             //设置中断定时1s     SFRIE1 |= WDTIE;                    //使能WDT中断          WDTIE=(0x0001)/* WDT Interrupt Enable */     _EINT();                            // 使能全局中断       while(1){         voice = GetAD(0);               //读取声音缓存         while(voice>3000){               //声音与阈值比较             counter=0;                  //定时器置零             do{                 light = GetAD(1);       //亮度读取                 light_Compare(light);                 voice = GetAD(0);       //读取声音缓存                 if(voice>3000){                     break;                 }                 if(counter >=10)        //判断计数时间,如果大于20s,关闭LED,并退出                 {                     P1OUT &= ~BIT5;                     P8OUT &= ~BIT1;                     P3OUT &= ~BIT7;                     P7OUT &= ~BIT4;                     P6OUT &= ~BIT3;                     P6OUT &= ~BIT4;                     P3OUT &= ~BIT5;                     break;                 }             }while(counter<10);         }     } } void light_Compare(int templight){      //LED发亮的个数与光敏电阻测出亮度成反比     P2OUT |= BIT5;                      //2.5置高     P2OUT &= ~BIT4;                     //2.4置低     P1OUT |= BIT5;                      //打开Nsleep,开大LED灯     if(templight >=700)         P8OUT |= BIT1;     else         P8OUT &= ~BIT1;     if(templight >= 1200)         P3OUT |= BIT7;     else         P3OUT &= ~BIT7;     if(templight >= 1500)         P7OUT |= BIT4;     else         P7OUT &= ~BIT4;     if(templight >= 2000)         P6OUT |= BIT3;     else         P6OUT &= ~BIT3;     if(templight >= 2500)         P6OUT |= BIT4;     else         P6OUT &= ~BIT4;     if(templight >= 3000)         P3OUT |= BIT5;     else         P3OUT &= ~BIT5; } void IO_Init(){             //六盏灯初始化,并全置零     P1DIR|= BIT0;           //六盏灯初始化,并全置零     P8DIR|= BIT1;     P3DIR|= BIT7;     P7DIR|= BIT4;     P6DIR|= BIT3;     P6DIR|= BIT4;     P3DIR|= BIT5;     P8OUT&=~BIT1;     P3OUT&=~BIT7;     P7OUT&=~BIT4;     P6OUT&=~BIT3;     P6OUT&=~BIT4;     P3OUT&=~BIT5;       P2DIR|= BIT4;           //2.4,2.5初始化     P2DIR|= BIT5;     P2OUT|= BIT5;     P2OUT&= ~BIT4;     P1DIR|= BIT5;           //大LED灯的驱动的电路开关方向 } #pragma vector= WDT_VECTOR __interrupt void watchdog_timer (void) {      counter ++;            //计时器加一      P1OUT^=BIT0;           //信号灯 } unsigned int  GetAD(char channel) {     unsigned int temp = 0;                              //设置变量     ADC12CTL0 |= ADC12SC;                               //开始采样转换     temp= ADC12MEM0;                                    //把结果赋给变量       switch (channel)       {           case 0:temp= ADC12MEM0;       break;          //选择通道0,P6.0             case 1:temp= ADC12MEM1;     break;          //选择通道1,P6.1             case 2:temp= ADC12MEM2;     break;          //选择通道2,P6.2             case 3:temp= ADC12MEM3;     break;          //选择通道3,P6.3             case 4:temp= ADC12MEM4;     break;          //选择通道4,P6.4             case 5:temp= ADC12MEM5;     break;          //选择通道5,P6.5  连接拨码电位器             case 6:temp= ADC12MEM6;     break;          //选择通道6,P6.6             case 12:temp= ADC12MEM12;    break;         //选择通道12,P7.0             default: ;break;         }     return temp; } void InitADC() {     ADC12CTL0 |= ADC12MSC;                              //自动循环采样转换     ADC12CTL0 |= ADC12ON;                               //启动ADC12模块     ADC12CTL1 |= ADC12CONSEQ_3 ;                        //选择序列通道多次循环采样转换     ADC12CTL1 |= ADC12SHP;                              //采样保持模式     ADC12CTL1  |= ADC12CSTARTADD_0;       ADC12MCTL0 |=ADC12INCH_0;                           //通道选择     ADC12MCTL1 |=ADC12INCH_1;     ADC12MCTL2 |=ADC12INCH_2;     ADC12MCTL3 |=ADC12INCH_3;     ADC12MCTL4 |=ADC12INCH_4;     ADC12MCTL5 |=ADC12INCH_5+ADC12EOS;       ADC12CTL0 |= ADC12ENC; }

  • 发表了主题帖: MSP430F5529单片机的DAC8552

    DAC8552是TI公司推出的16 位双路电压输出数模转换器,本次来介绍一下这个芯片在MSP430单片机上如何使用。 1.芯片的电路图介绍 一共才八个引脚,比较简单,具体介绍我就不说了,如果小伙伴们有疑问或者更具体的资料可以去官网直接去查datasheet,一共就二十来页,一会儿就看完了。 2.程序介绍 先来说一下dac8552库函数怎么写 void DAC8552_Init() {     P1DIR|=BIT3+BIT4+BIT5;   //配置MSP430的引脚     SYNC_H;     SCLK_H; } void DAC8552_Write(unsigned int cmd,unsigned int data)   //往里写命令和数据  {     unsigned int temp1=0,temp2=0;     unsigned char i=0;     temp2=data;     temp1=cmd;     SYNC_L;          //使能拉低           for(i=0;i<8;i++)    //  高8位写控制命令      {         SCLK_H;         if(temp1&0x80)             DIN_H;         else             DIN_L;         SCLK_L;         temp1=temp1<<1;     }               for(i=0;i<16;i++)   //  低16位写数据      {         SCLK_H;         if(temp2&0x8000)             DIN_H;         else             DIN_L;         SCLK_L;         temp2=temp2<<1;     }     SYNC_H;         //使能拉高  } OK是不是感觉非常简单 main函数更加简单,就是调用刚刚写过的函数,配置一下你想要的参数而已,还有更多的参数可以去翻阅datasheet void main(void) {     WDTCTL = WDTPW + WDTHOLD;    // Stop watchdog timer     DAC8552_Init();     while(1)     {    write2DAC8552( 0x24,0xFFFF);//  0x24 B通道         //SYNC_HIGH;  //使能禁止     } }

  • 发表了主题帖: msp430f2618写16位双通道 SPI接口DA DAC8552 精确度超高

    直接上代码,我就不做太多解释了。。 #include "msp430x26x.h" #include "DAC8552.H" //===============DELAY========================= void delay_DA(uint xms) {   uint i,j;   for(i = xms; i > 0; i--)       for(j = 220; j > 0; j--); } /******************************************* 函数名称:write_DAC8552 功    能:写8552DA芯片 参    数:data 24位数据        返回值  :无 ********************************************/ void write_DAC8552(long int data) {   uint i;   DAC8552_DIR;   DAC8552_OUT;   CS_H;   CS_L;   delay_DA(1);   for(i = 0; i < 24; i++)   {     SCLK_H;     if(data & 0x800000) DATA_H;     else DATA_L;     SCLK_L;     delay_DA(1);     data <<= 1;   }   SCLK_L;   CS_H; } /******************************************* 函数名称:write_DAC8552_channelAB 功    能:写8552DA芯片 参    数:data 24位数据        返回值  :无 ********************************************/ void write_DAC8552_channelAB(long int data1,long int data2) {   data1 = data1 | 0x000000;   write_DAC8552(data1);   delay_DA(5);   data2 = 0x340000 | data2;   write_DAC8552(data2);   delay_DA(5); } /******************************************* 函数名称:updata_DAC8552_channelAB 功    能:更新数据 参    数:data 24位数据        返回值  :无 ********************************************/ void updata_DAC8552_channelAB(long int data1,long int data2) {   data1 = data1 | 0x100000;   write_DAC8552(data1);   delay_DA(5);   data2 = data2 | 0x240000;   write_DAC8552(data2);   delay_DA(5); }

  • 2020-12-16
  • 发表了主题帖: 单片机编程中变量初始化问题

    在单片机编程中,关于变量的初始化,我犯过很多错误。最常见的就是在变量定义尤其是函数内部的局部变量定义时,没有在定义时就对变量初始化,然后在程序中直接用了这个变量,导致运算出错。如果使用前有赋值操作,一般不会出错。因此变量在使用前,最好有赋值操作,或者在初始化时直接赋初值。

  • 发表了主题帖: MCU超低功耗ULPMark-CP基准测试排行

    如下图示为MCU超低功耗ULPMark-CP前20名排名,分值越大越好。 可以看出其中的MCU全部基于ARM Cortex-M内核。 在新的超低功耗应用选型时可以考虑下表中的MCU。

  • 发表了主题帖: 如何在嵌入式系统中高效解码并播放音频文件

         音频接口日益成为嵌入式设计的期望特性。与此同时,嵌入式系统的用户对音频质量的要求越来越高。对开发人员来说,这带来了如下挑战:如何在基于微控制器的系统中运行 MP3 或其他音频文件。这些系统不仅受资源限制,而且缺少便于开发人员在 Linux 系统上使用的音频接口。因此,解码音频文件并高效地将内容转换为模拟声音,就变得更加困难。 开发人员还必须在硬件或软件解决方案之间谨慎选择,并决定使用哪些元器件,这是因为成本、空间和开发时间都是重要考虑因素。      本文介绍了 AKM Semiconductor、Adafruit、STMicroelectronics 和 Cirrus Logic Inc. 提供的几种硬件和软件解决方案,开发人员可以使用它们来高效地将音频文件添加到其嵌入式设备中。此外,本文还说明了一些“小技巧”,以帮助确保解决方案成功实施。 选择嵌入式音频格式     在深入探讨如何将音频功能集成到嵌入式设备之前,有必要仔细思考为何通常首选 MP3 音频格式。对于嵌入式系统,实际上有三种潜在音频格式可供开发人员使用:脉冲编码调制 (PCM)、WAV 和 MP3。       PCM 是一种未经压缩的无损音频格式,常由音频编解码器用来将音频流的数字表示转换为用户听到的模拟声音。这是一种广受支持的标准格式,可以追溯到 CD 年代。PCM 可以在嵌入式系统中使用,但问题是 PCM 文件通常比 WAV 或 MP3 文件大得多。在资源受限且锱铢必较的设备中,若要支持这种格式,产品可能需要更大的外部存储设备或具有更大存储器的微控制器。因此,除非产品容量低、只有一个音频文件或成本不受限制,否则通常会避免使用 PCM。      WAV 文件也是未经压缩且无损的,这方面与 PCM 非常相似。WAV 文件在嵌入式应用中往往比 PCM 文件更受欢迎,但它同样会占用大量空间。如果嵌入式系统已经有 SD 卡或其他大容量存储设备,那么 WAV 文件可能非常适合。     对于大多数系统,MP3 文件是首选音频格式。MP3 文件是有损的,因此在对音频进行编码时,可能会损失一些音频保真度。但是,MP3 远小于 PCM 或 WAV,因此将音频文件放到设备上的传输和存储时间更短,并且其对存储器的要求也更小。 一旦决定要使用 MP3,开发人员便可选择使用硬件或软件来实现。 基于硬件的 MP3 解码      最快速、最简单的解决方案通常是使用硬件 MP3 解码器,例如 Adafruit 的 681 VS1053B(图 1)。VS1053B 可以通过串行流直接接受 MP3、WAV、OGG 或 MIDI 文件格式并进行解码,开发人员几乎不需要花什么精力。对流进行解码后,VS1053B 利用 18 位数模转换器 (DAC) 将其转换为音频。 图 1:Adafruit 的 VS1053B 是基于硬件的 MP3 解码器芯片,可接收音频流并将其解码为代表性的模拟音频信号。此解决方案所需的软件最少,并且不需要开发人员了解如何解码或转换 MP3 文件。(图片来源:Adafruit) VS1053B 真正有意思的地方是,与许多其他使用 I2C 的解码器相比,它还能通过简单的 UART 进行调试和控制。此外,它有八个通用输入/输出引脚,可用于读取位、设置开关或状态 LED 之类的应用功能。 对于希望尝试基于硬件的解决方案的开发人员,不必为 VS1053B 定制分线板。Adafruit 提供 381 VS1053B 编解码器 + MicroSD 分线板。除 VS1053B 外,该板还有一个 MicroSD 卡插槽,可用于存储音频文件以进行解码(图 2)。分线板可连接到微控制器,后者通过 SPI 或 SDIO 端口连接到 SD 卡以读出音频文件。音频文件流随后传送到 VS1053B 进行解码。然后,可以根据需要将 VL1053B 的输出导向耳机插孔或扬声器等。 图 2:Adafruit 的 1381 VS1053B 编解码器 + MicroSD 分线板包含必要的硬件,可轻松连接微控制器以播放音频。分线板上有一个板载 MicroSD 卡插槽,微控制器可以通过 SPI 读取卡内容,然后将文件传输到 VS1053B 进行解码。(图片来源:Adafruit) 基于软件的 MP3 解码 一种稍微复杂一点但从物料 (BOM) 角度看成本常常更低的解决方案,是在微控制器上解码 MP3 文件,然后将解码后的文件流式传输到音频编解码器以生成音频。为了实施基于软件的高效解决方案,开发人员需要实现若干关键组件,例如: MP3 解码器库 存储驱动程序 文件系统堆栈 直接存储器访问 (DMA) 驱动程序 I2S 驱动程序 I2C 驱动程序 音频编解码器驱动程序 乍看之下,软件开发人员似乎有大量工作要做,需要集成许多具有挑战性的软件组件以将 MP3 解码并转换为音频。实现 MP3 解码解决方案的最佳办法是利用一个支持音频编码、解码和常规处理的微控制器平台。 尽管可以在互联网上找到许多开源解决方案,但 STM32 工具链是开发人员可以利用的专业可靠、久经考验的解决方案。STM32 微控制器系列有一个称为 STM32CubeMx 的开发工具,其与 STM32CubeIDE 集成在一起,后者包含音频示例和开发库。这些示例和工具是 STM32CubeMX 附加插件(称为 X-CUBE-AUDIO)的一部分。该插件为 Arm Cortex-M4 类微控制器中的所有 STM32 处理器提供了用于 MP3 解码的音频库。 具体来说,它有一些代码项目示例可用于创建能在 STM32F469IGH6TR 微控制器上运行的 MP3 播放器。STM32F469IGH6TR 是一款功能强大的微控制器,具有 1 兆字节 (MB) 的闪存和 384 KB 的 RAM,运行速率为 180 兆赫兹 (MHz)。该微控制器采用 176 引脚 UBGA 封装,提供了大量 GPIO 和外设特性,支持几乎所有应用。 图 3:STM32F469IGH6TR 是一款 180 MHz Arm Cortex-M4 处理器,具有 1 MB 的闪存和 384 KB 的 RAM。176 引脚 UBGA 封装提供了大量 GPIO,支持几乎所有嵌入式应用。(图片来源:STMicroelectronics) MP3 播放器代码示例运行在 STM32F469I-DISCO Discovery 套件上(图 4)。STM32F469I-DISCO 包含 MP3 解码和播放所需的一切功能。该板有一块 4 英寸 800 x 480 像素 LCD,用于将当前 MP3 演示状态告知开发人员,另外还提供了播放、停止、下一首、上一首等播放器控件。此外,Discovery 板还含有耳机插孔,能以立体声方式播放所产生的音频。关于示例代码,唯一需要注意的是 MP3 文件须由外部提供,具体来说是由 USB 驱动大容量存储设备提供,其通过 micro USB 连接器连接。 图 4:STM32F469I-DISCO Discovery 套件有一个 4 英寸 LCD,用于操作 MP3 播放器演示。音频文件由外部 USB 大容量存储设备通过板载 Micro USB 连接器提供。它提供了一个解码 MP3 文件的实际范例。(图片来源:STMicroelectronics) 虽然 MP3 解码库确实需要 Arm Cortex-M4 或更好的处理器,但事实证明,在开发板上运行演示代码是一种很好的方式,不仅可以查看和试验实际范例,而且还能验证应用性能。使用串行线调试 (SWD) 接口和 Arm 内核的仪器跟踪宏单元 (ITM) 功能,可以对程序计数器执行统计分析,确定大约需要多大处理能力来解码并播放 MP3 文件。结果是,将近 50% 的 CPU 时间用于更新 LCD 显示,而 10% 或更少的时间用于 MP3 解码。STMicroelectronics 的音频库非常有效,其使用 DMA 将 I2S 上的解码帧推送到音频编解码器。 如果应用不需要 LCD,仅需要基于其他系统事件来播放音频,那么可以使用功能较少的处理器。例如,开发人员可以看看 STM32F469VGT6。STM32F469VGT6 仍然非常强大,具有 1 MB 的闪存和 384 KB 的 RAM,全部位于 100 引脚 LQFP 中。该器件没有使用 BGA 封装,该封装有时可能会让开发人员和制造商望而却步。 图 5:STM32F469VGT6 是一款 180 MHz 处理器,具有 1 MB 的闪存和 384 KB 的 RAM。该器件基于 Arm Cortex-M4 系列,由 STMicroelectronics 音频库支持。如图所示,它采用 100 引脚 LQFP 封装,这会让开发人员和制造商没那么望而却步。(图片来源:STMicroelectronics) 开发人员选定并试用了他们认为最适合其应用的解决方案之后,就需要决定如何将解码的 MP3 文件从数字波形转换为模拟声音。 利用编解码器将音频流转换为声音 大多数基于硬件的解码解决方案还会包括一个数模转换器 (DAC),用于将接收到的数字文件格式转换为模拟声音。但是,这些芯片通常包含 I2S 输出端口,允许开发人员添加自己的音频编解码器。基于软件的解决方案肯定需要编解码器,才能将解码的数字流转换为音频。有两种方法可以完成此任务。 第一种方法是可以获取数字音频,利用微控制器的板载 DAC 外设生成音频输出。一般而言,这不是生成音频的最佳方法,因为它需要额外的分立元器件以及精心的模拟电路设计和布局,才能获得高质量输出。此外,微控制器上也需要进行更多设置才能让 DAC 正常运行,而且一般还需要额外的处理器电源以确保 DAC 获得适当的供电。 第二种方法(一般推荐采用这种方法)是使用集成的音频编解码器。音频编解码器基本上是集成电路,具备所有用于生成模拟输出的电路,例如 DAC 和 D 类放大器。相比于分立解决方案,音频编解码器的优势在于占用的电路板空间非常小,而且还能内置数字电路来控制音频输出流。 举例来说,Cirrus Logic 的 CS43L22-CNZ DAC 为开发人员提供了广泛的功能,例如: 通过 I2C 总线执行 DAC 控制 多路输出,例如耳机和扬声器 无需外部输出滤波 数字信号处理器引擎,用于音量、低音和高音控制 滴答和噼啪噪声抑制 CS43L22-CNZ 通过 I2S 接口从微控制器接收 PCM 编码的数据流,然后使用其内部 DAC 进行转换(图 6)。CS43L22-CNZ DAC 可以驱动多路输出,例如扬声器或耳机。如果使用单个单声道,CS43L22-CNZ 可以向扬声器输出 2 W 功率;如果使用立体声声道,则每个声道最多为 1 W。 图 6:CS43L22-CNZ DAC 是一种音频 DAC,可通过单声道输出最高 2 W 的功率,或以立体声音频输出每通道 1 W 的功率。该 DAC 具有一个数字信号处理引擎,可轻松控制音量、低音和高音。(图片来源:Cirrus Logic) 一些开发人员可能不需要 CS43L22-CNZ 的全部功能,可以通过精简来节省一些 BOM 成本。 当然,这取决于应用的要求,但这种方法有一个很好的例子,那就是 AKM 的 AK4637EN 音频编解码器(图 7)。这是一款 24 位单声道编解码器,其输出 DAC 仅用于扬声器。该编解码器还有一个麦克风放大器,如果应用需要,它也可以用来录制音频。 图 7:AK4637EN 是采用 20 引脚 QFN 小型封装的音频 DAC,可输出最高 1 W 的单声道音频。该编解码器可通过 I2C 总线以数字方式进行控制,以管理输出音量和自动输出控制。(图片来源:AKM Semiconductor) 同大多数音频编解码器一样,AK4637EN 也有 I2S 接口,用以接收来自微控制器的数字音频信号。此外,该芯片还有 I2C 接口,用于控制板载数字特性,例如音量控制。 与任何产品功能一样,开发人员需要花时间仔细检查其对系统的要求,并在编解码器特性和成本与目标 BOM 成本之间取得平衡。 实现 MP3 解决方案的技巧与诀窍 开发人员在为应用选择适当的解决方案时,可以使用以下“小技巧”: 以预期的生产量执行 BOM 成本分析比较:一种情况是使用外部 MP3 解码器,另一种情况是使用功能更强大的、能够自行运行 MP3 解码器的微控制器。务必使用悲观、可达成和乐观三种生产量数字来确定更好的决策范围。 利用支持 I2S 的音频编解码器生成输出音频。分立解决方案的调整可能更耗时,而元器件成本可能相当。 使用开发板对 MP3 软件库进行性能分析,以了解解决方案运行所需的最低微控制器特性。 利用 DMA 通道将解码的 MP3 帧通过 I2S 接口传输到音频编解码器。这将支持使用较为便宜的处理器。 仔细检查 MP3 软件库许可,确保它们可与商业产品一起使用。除非是芯片供应商提供,否则大多数开源库用于商业产品时都需要付费许可证。 遵循以上提示将有助于确保开发人员为其嵌入式应用选择正确的音频解决方案。 总结 为嵌入式系统增加音频功能曾经是一项复杂的工作,但是如本文所示,如今的开发人员有大量解决方案可供选择:既有专用的外部编解码器,也有集成的软件库。尽管如此,开发人员仍需要仔细评估应用需求,确定哪种解决路径最合理。 需要考虑的因素包括:BOM,解决方案的复杂性,开发和集成的时间与成本,以及解决方案的可扩展性。一旦对照产品批量、目标成本和开发计划权衡上述因素,最合适的解决方案就会变得清晰起来。

  • 发表了主题帖: 几款常用的代码比较工具

    Beyond Compare Beyond Compare是程序员常用的一款轻量级、使用简单的代码比较工具。准确的说它是一款文件/文件夹比较工具,支持多种文件进行比较,包含代码、文本、图片等文件。 Beyond Compare支持Windows、Mac、Linux三大操作系统,同时支持多种语言,包含中文、英文、日文、德文、法文等,同时还有很多翻译版本。 目前(2020-12)Beyond Compare最新版本为V4.3.7。 Beyond Compare可以很方便地对比出两份源代码文件之间的不同之处,相差的每一个字节用颜色加以表示,查看方便,支持多种规则对比。 Beyond Compare选择最好的方法来突出不同之处,文本文件可以用语法高亮和设置比较规则的方法进行查看和编辑,适用于用于文档、源代码和HTML。 官方下载地址: http://www.scootersoftware.com/download.php 同时国内下载地址: https://www.beyondcompare.cc/xiazai.html Beyond Compare为收费软件,提供有30天试用版,国内经销商提供的参考价格为259元(标准版)、469元(专业版)。 Code Compare Code Compare是一款用于程序代码文件的比较工具,目前Code Compare支持的对比语言有:C#、C++、CSS、HTML、Java、JavaScrip等代码语言。Code Compare 支持文件和文件夹比较、合并等功能。 它支持集成在源代码版本控制工具中,如:SVN、 Git、 TFS、Mercurial和Perforce等这些版本控制工具。同时,Code Compare支持集成Visual Studio 2015、 2017、 2019等开发环境中。 目前(2020-12)Code Compare最新版本为V5.3.231,支持Windows操作系统,有试用版、免费版和专业版: 官方下载地址: https://www.devart.com/codecompare/download.html WinMerge WinMerge是一款应用于Windows环境下的代码差异比较和合并的轻量级、免费工具,支持比较文件/文件夹进行比较。 支持常规的代码、文本、图像、表格、压缩文件等文件进行比较,可视文本格式显示差异。 WinMerge会将两个文件内容做对比,并在相异之处以高亮度的方式显示,让使用者可以很快的查知;可以直接让左方的文件内容直接覆盖至右方,或者反过来也可以覆盖。使用它可以非常方便地比较多个文档内容,适合程序员或者经常需要撰写文稿的朋友使用。 安装和系统要求: - 安装程序的管理员权限 - 32位:XP或更高版本 - 64位:Win7或更高版本 目前(2020-12)WinMerge最新稳定版本为V2.16.8 官方下载地址: https://winmerge.org/downloads UltraCompare UltraCompare也是一款经典的代码比较工具,支持常规的文件、文件夹比较、合并。包含:支持源代码、Word/Excel/PDF、Zip/Rar/Jar等文件比较。 这款工具同样也是一款强大的比较工具,除了以上基本功能之外,还支持远程文件/文件夹比较、同步,三文件比较、切换主题皮肤等。 UltraCompare支持Windows、Mac和Linux三大操作系统,同时包含中、英、美、日、韩等多国语言的版本。 一款强大的工具逃不过收费这一关,UltraCompare也不例外,它是一款收费软件,但支持30天免费试用。 目前(2020-12)UltraCompare最新版本为V20.0 官方下载地址: http://www.ultraedit.cn/downloads/ultracompare_download.html Diffuse Diffuse是一款轻量级的代码/文件/文件夹比较工具,安装包大小不到10M。 Diffuse在命令行中的速度是相当快的,支持像 C++、Python、Java、XML 等语言的语法高亮显示。可视化比较,非常直观,支持两相比较和三相比较。这就是说,使用 Diffuse 你可以同时比较两个或三个文本文件。 支持常见的版本控制工具,包括 CVS、subversion、git、mercurial 等,你可以通过 Diffuse 直接从版本控制系统获取源代码,以便对其进行比较和合并。 它是一款免费的工具,遵循GNU General Public License version 2.0 (GPLv2)协议。使用比较简单,和常规的文件比较工具类似。 下载地址: https://sourceforge.net/projects/diffuse/ 其他 除了以上列举的一些常用、且还在更新维护的比较工具之外,还有很多已经停止更新的经典的比较工具。 1.DiffMerge DiffMerge是国外的一款经典的、轻量级的、支持文件/文件夹比较、合并工具,支持3个文件同时进行对比: 图片 它支持Windows、 OS X和Linux三大操作系统,该工具最后更新时间是在2013年10月,版本为V4.2.0。 下载地址: http://sourcegear.com/diffmerge/downloads.php 2.TextDiff 这是一款在08年就停止更新的经典比较工具,支持现在流行比较工具的常规比较功能,关键是它免费。 这个工具比较轻量级,exe文件只有840k,且不用安装,下载解压直接打开可以使用 下载地址: http://www.angusj.com/delphi/diff.zip 3.AptDiff 这款工具也是一款较老且经典的工具,目前官方已经没有维护更新了,只能在第三方平台下载(要小心,不然下载了不正规的软件)。 AptDiff可以对文本和二进制文件进行比较和合并,适用于软件开发、网络设计和其它的专业领域。 它使用方便,支持键盘快捷键,可以同步进行横向和纵向卷动,支持Unicode格式和大于4GB的文件,可以生成HTML格式的比较报告。 4.版本管理软件集成比较工具 像我们常用的Git、 SVN都集成了比较工具,上面有些比较工具也可以集成在Git、 SVN中使用(见上面比较工具说明)。

  • 发表了主题帖: 单片机AD采集正弦波怎么判断频率?

    现在通过运放把交流电输入给单片机PIC16F877A的AD口,程序代码是汇编,故没怎么看懂,程序中这样写的好像是判断采集次数来判断波形是50HZ或者60HZ,而且为了判断交流电的幅值通过累加后与一固定值做比较的,AD是10位AD故程序中采集的值与0x7f差的绝对值累加和与一数值做比较,请问这是什么道理?因为AD是10位且采样的时候运放把交流波形抬到5V的中点左右,即交流电的0V与2.5V相重合,故采集到的值0X7F做减法我可以理解,但不明白的如下:运放电路图和运放输出到AD口的电压波形如图所示。但疑问如下 1.程序中每400US处理AD程序一次,且通过AD采集的次数与24做比较来判断波形是50HZ或者60HZ 这是什么道理? 2.为什么每次采集的值累加和与一固定值做比较来判断输入电压的幅值是220V或者380V 程序中有段注释 如下 ;(半周期采样幅值累加值 < #0x0350)   请问0x0350是怎么得来的? 我们的这款产品是PIC 汇编看着太长,请问单片机怎么判断交流电的频率和幅值?

  • 发表了主题帖: 一款芯片的研发生产全流程

      1、芯片研发基本过程 一款芯片的设计开发,首先是根据产品应用的需求,设计应用系统,来初步确定应用对芯片功能和性能指标的要求,以及哪些功能可以集成,哪些功能只能外部实现,芯片工艺及工艺平台的选择,芯片管脚数量,封装形式等等,达到整个应用系统的成本低性能高,达到最优的性价比。 2,之后,进入系统开发和原型验证阶段。根据芯片的框架结构,采用分立元件设计电路板,数字系统一般用 FPGA 开发平台进行原型开发和测试验证(常见的 FPGA 有 XILINX 和 ALTERA两个品牌)。 3,模拟芯片的设计,验证手段主要是根据工艺厂提供的参数模型来仿真,最终能达到的性能指标只能通过真实的投片,进行验证设计;而数字系统设计一般可通过计算机仿真和 FPGA系统,进行充分的设计验证,然后可以直接投片。因此数模混合的芯片产品开发,一般需要模拟模块先投片验证,性能指标测试通过后,然后再进行整体投片。 4,系统开发和原型验证通过后,就进入芯片版图的设计实现阶段,就是数字后端、与模拟版图拼接。版图设计过程中,要进行设计验证,包括 DRC、LVS、ANT、后仿真等等。芯片版图通过各种仿真验证后就可以生成GDS文件,发给代工厂(或者制版厂),就是常说的 tapeout了。 5,代工厂数据处理,拿到 GDS 数据后,需要再次进行 DRC 检查,然后数据处理,版层运算,填充测试图形等操作,之后发给制版厂开始制版。,6,制版完成后,光刻版交给代工厂就可以进行圆片加工了。 7,圆片加工完成后,送至中测厂进行中测,也叫晶圆测试(Chip Test,简称 CP)。中测完成,圆片上打点标记失效的管芯,交给封装厂。 8,封装厂进行圆片减薄、贴膜、划片、粘片、打线、注塑、切金、烘干、镀锡等等操作后,封装完成。目前封装技术比较成熟,常见封装良率在 99.5%以上,甚至 99.9%以上。 9,芯片有些功能和性能在中测时无法检验的,需要进行成测(Final Test,简称 FT)。 10,成测完成的芯片,即可入产品库,转入市场销售了。 11,芯片的研发过程,是一个多次循环迭代的过程。测试验证过程中发现问题,就需要返回修改设计,然后再次测试验证;后端版图实现过程中,如果时序、功耗、面积、后仿真等通不过,也可能要返回原始设计进行修改;芯片投片出来后,测试性能指标和可靠性达不到设计要求,需要分析定位问题,修改设计,再次投片验证,等等。 12,芯片研发环节多,投入大,周期长。任何一个细节考虑不到或者出错,都有可能导致投片失败;技术研发充满了不确定性,可能导致时间拖延及投片失败。因此,一个成熟产品的研发,可能需要多次的投片验证,导致周期很长。 13,现在芯片设计的规模比较大,系统复杂,为了减小投片风险,系统设计和测试验证的工作十分重要,一方面依靠强大的 EDA 工具,另一方面依靠经验和人员时间投入。 14,芯片转入量产后,如果成品率不稳定或低于预期,需要与代工厂分析原因,进行工艺参数调整,多次实验后,找到最稳定的工艺窗口,提高芯片的可靠性和良率,降低成本。 IC 研发生产全流程示意图 IC 研发生产全流程示意图 常见的芯片投片方式说明芯片常用投片方式有工程批(FULLMASK)和多项目晶圆(Multi Project Wafer,简称 MPW)两种方式。 随着制造工艺水平的提高,在生产线上制造芯片的费用不断上涨,一次 0.6 微米工艺的工程批生产费用就要 20-30 万元,而一次 0.18 微米工艺的工程批生产费用则需要 60-120 万元,如果采用高阶工艺,试验片成本更会呈几何倍数提高。如果设计中存在问题,那么制造出来的所有芯片将全部报废。MPW 就是将多个具有相同工艺的集成电路设计放在同一晶圆片上流片,流片后,每个设计品种可以得到几十片芯片样品,这一数量对于设计开发阶段的实验、测试已经足够。而实验费用就由所有参加 MPW 的项目按照芯片面积分摊,成本仅为工程批的 10%-20%,极大地降低新产品开发成本和开发风险。MPW 一般由工艺厂组织,每年定期有班次。虽 MPW 降低了集成电路研发阶段的费用门槛,但也伴随着一些投片灵活度低、生产周期长、单位面积有限制等制约因素。 具体的投片方式,需要根据设计成功率、资金预算、时间周期来具体选择。两种投票方式对比表:

  • 发表了主题帖: 摄像头模组为什么用小尺寸EEPROM芯片

    摄像头模组为什么要用EEPROM   以往在摄像头模组中摄像头相关的各种参数被放进Sensor的内部存储空间(OTP的,最多支持三次烧录),其缺点不言而喻,一旦在OTP中烧录数据发生错误,就会导致Sensor报废,增大了生产成本。加上Sensor存储空间一般较少,随着消费者对摄像头模组成像品质及快速对焦等需求增高,摄像头模组中存储的数据(镜头参数,白平衡参数,自动对焦位置信息及其它一些出厂设置和版本信息等)越来越大,Sensor的内部空间已经不能满足需求。EEPROM以其通用性,稳定的数据存储,各种规格容量,满足了摄像头模组对参数存储的各种需求。就目前来看,普通的8M/13M及以上的摄像头模组选用16-64K的EEPROM存储器,带OIS、双摄像头等功能的摄像头模组,则选用更大容量的64-128K的EEPROM存储器。   摄像头模组用EEPROM的前世和今生- ?   在摄像头模组用的EEPROM市场方面,以前是欧美日企的天下,主要的代表有安森美(Onsemi)、意法(ST)、爱特梅尔(Atmel)、罗姆(Rohm)等公司的产品。这些公司的EEPROM产品性能不错,但是价格较高,且本土化服务也跟不上。为此,摄像头模组行业内希望能有国产的EEPRO存储器来替代欧美日的同类产品。可喜的是,如今国产的EEPROM存储器的领军企业如复旦微(FM),聚辰(GT)等以更好的性价比,开始迅速占领摄像头模组用的EEPROM市场。   从性能来讲,复旦微与安森美、ST等欧美品牌相当,但供货、价格、服务都更有优势。复旦微(FM)的EEPROM存储器已经在国内的工控仪表、电表、蓝牙、PC周边设备、家电等领域已经占据了重要的地位,现在快速进入到摄像头模组领域,显示了其强劲的竞争优势。可以说摄像头模组行业的EEPROM存储器使用,国产化已成为主流和趋势。     在许多的国产EEPROM芯片中,针对手机摄像头CCM模组市场特点,上海贝岭推出了几款WLCSP封装EEPROM产品。随着国内外CCM市场蓬勃发展,上海贝岭从2015年逐步推出新一代宽电压WLCSP封装EEPROM产品,主要型号有:BL24C16/BL24C32/BL24C64/BL24C128 。

  • 2020-12-15
  • 发表了主题帖: 基于TI AM5728(浮点双DSP C66x +双ARM Cortex-A15)的开发板

    开发板简介 基于TI AM5728浮点双DSP C66x +双ARM Cortex-A15工业控制及高性能音视频处理器; 多核异构CPU,集成双核Cortex-A15、双核C66x浮点DSP、双核PRU-ICSS、双核Cortex-M4 IPU、双核GPU等处理单元,支持OpenCL、OpenMP、IPC多核开发; 强劲的视频编解码能力,支持1路1080P60或2路720P60或4路720P30视频硬件编解码,支持H.265视频软解码; 支持高达1路1080P60全高清视频输入和1路LCD + 1路HDMI 1.4a输出; 双核PRU-ICSS工业实时控制子系统,支持EtherCAT、EtherNet/IP、PROFIBUS等工业协议; 高性能GPU,双核SGX544 3D加速器和GC320 2D图形加速引擎,支持OpenGL ES2.0; 外设接口丰富,集成双千兆网、PCIe、GPMC、USB 2.0、UART、SPI、QSPI、SATA 2.0、I2C、DCAN等工业控制总线和接口,支持极速接口USB 3.0; 开发板引出V-PORT视频接口,可以灵活接入视频输入模块; 体积极小,大小仅86.5mm*60.5mm; 工业级精密B2B连接器,0.5mm间距,稳定,易插拔,防反插,关键大数据接口使用高速连接器,保证信号完整性。 图 1 开发板正面图1 图 2 开发板正面图2 TL5728-EasyEVM是一款广州创龙基于TI AM5728(浮点双DSP C66x +双ARM Cortex-A15)SOM-TL5728核心板设计的开发板,它为用户提供了SOM-TL5728核心板的测试平台,用于快速评估SOM-TL5728核心板的整体性能。 TL5728-EasyEVM底板采用沉金无铅工艺的4层板设计,不仅为客户提供丰富的AM5728入门教程,还协助客户进行底板的开发,提供长期、全面的技术支持,帮助客户以最快的速度进行产品的二次开发,实现产品的快速上市。 不仅提供丰富的Demo程序,还提供DSP+ARM多核通信开发教程,全面的技术支持,协助用户进行底板设计和调试以及DSP+ARM软件开发。 典型运用领域 工业PC&HMI 工业机器人 机器视觉 医疗影像 电力自动化 EtherCAT主/从控制器 工业多协议智能网关 高端数控系统 软硬件参数 硬件框图 图 3 开发板硬件框图 图 4 开发板硬件资源图解1 图 5 开发板硬件资源图解2 硬件参数 表 1 CPU TI AM5728,浮点双DSP C66x +双ARM Cortex-A15 主频:750MHz(DSP) + 1.5GHz(ARM) L2 Cache ARM Cortex-A15:1MByte C66x:288KByte On-ChipMemory 2.5MByte ROM 4/8GByte eMMC RAM 1/2GByte DDR3 SPI Flash 32MByte QSPI Flash Encryption Chip 1x ATAES132A-SHEQ TemperatureSensor 1x TMP102AIDRLT LED 2x电源指示灯(底板1个,核心板1个) 5x可编程指示灯(底板3个,核心板2个) B2B Connector 2x 80pin公座B2B,2x 80pin母座B2B,间距0.5mm,合高5.0mm;1x 80pin高速连接器,间距0.5mm,合高5.0mm;共400pin IO 2x IDC3简易牛角座(2x 25pin规格),间距2.54mm,包含GPMC、QSPI、SPI、eQEP、eCAP、PWM、MMC、TIMER、UART等拓展信号 KEY 1x冷复位按键 1x热复位按键 3x可编程输入按键(含1个非屏蔽中断按键) JTAG 1x 14pin TI Rev B JTAG接口,间距2.54mm DISPLAY 1x电阻屏,40pin FPC母座,间距0.5mm BOOT SET 1x 5bit拨码开关 SD 1x Micro SD接口 RTC 1x CR1220,3V Ethernet 2x RGMII,RJ45接口,10/100/1000M自适应 USB 1x Micro USB 2.0接口 1x USB 3.0接口 CAN 1x 3pin 3.81mm绿色端子 UART 1x UART3,Micro USB接口,全双工模式 1x RS232串口(UART1),全双工模式 1x RS485串口(UART10),半双工模式 PCIe 1x PCIe Gen2,2通道,每通道最高通信速率5GBaud SATA 1x 7pin SATA硬盘接口 HDMIOUT 1x HDMI 1.4a接口 Video Module 1x V-PORT接口 SWITCH 1x电源拨码开关 FAN 1x 3pin 12V风扇插座 POWER 1x 12V 2A直流输入DC417电源接口,外径4.4mm,内径1.65mm 软件参数 表 2 ARM端软件支持 Linux-4.4.19,Linux-RT 4.9.65,TI-RTOS DSP端软件支持 TI-RTOS CCS版本号 CCS6.1.3 图形界面开发工具 Qt 双核通信组件支持 IPC 软件开发套件提供 Processor-SDK Linux、Processor-SDK Linux-RT、Processor-SDK TI-RTOS Linux驱动支持 QSPI Flash DDR3 PCIe eMMC MMC/SD USB 3.0 PCIe 2.0 USB 2.0 LED BUTTON RS232 RS485 HDMI OUT DCAN SATA RTC 4.3inch Touch Screen LCD(Res) 7inch Touch Screen LCD(Res) SPI QSPI UART JTAG EMCRYDTIC TEMPERATURE SENSOR KBD HDQ NMI SYS INT eCAP I2C 开发资料 提供核心板引脚定义、可编辑底板原理图、可编辑底板PCB、芯片Datasheet,缩短硬件设计周期; 提供系统烧写镜像、内核驱动源码、文件系统源码,以及丰富的Demo程序; 提供完整的平台开发包、入门教程,节省软件整理时间,上手容易; 提供详细的DSP+ARM多核通信教程,完美解决多核开发瓶颈; 提供基于Qt的图形界面开发教程。 开发例程主要包括: 基于ARM端的Linux开发例程 基于TI-RTOS的ARM、DSP、PRU、IPU的开发例程 基于OpenCL、OpenMP、IPC的多核开发例程 基于OpenCV的图像开发例程 基于Qt的入门开发例程 基于TI-RTOS和Linux的EtherCAT开发例程 视频采集和编解码例程 电气特性 核心板工作环境 表 3 环境参数 最小值 典型值 最大值 工业级温度 -40°C / 85°C 工作电压 / 5V ( ±5% ) / 功耗测试 表 4 类别 典型值电压 典型值电流 典型值功耗 核心板 5V 950mA 4.75W 整板 12V 600mA 7.2W 备注:功耗测试基于广州创龙TL5728-EasyEVM开发板进行。

统计信息

已有45人来访过

  • 芯币:289
  • 好友:--
  • 主题:544
  • 回复:37
  • 课时:--
  • 资源:--

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言