还未设置个性签名
成为VIP会员 享9项特权: 开通会员

完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>

3天内不再提示

基于STM32G031开发板的双通道简易示波器设计

电子森林 来源:电子森林 作者:电子森林 2022-03-22 09:13 次阅读

引言

寒假练有一款白色的、非常美观的、双通道输入的基于STM32G031的板卡,它可以实现哪些功能呢?示波器、DDS信号发生器、频谱分析仪、失真度测量仪等等。 今天我们来看一位来自南京大学的【电子卷卷怪】同学所做的双通道简易示波器项目,这位同学还帮助多个参加寒假练的同学亲自解决了他们的问题。

项目成果概述

本项目使用硬禾课堂STM32G031开发板卡以及STM32CubeIDE开发工具,实现了一个简易的示波器。示波器的各项参数或功能概述如下:

1. 外观

(1)有主界面、副界面两个界面,并可以相互切换;

(2)主界面包含波形模式和FFT模式,分别显示被测信号的波形和频谱;

(3)波形模式包含:垂直尺度调整、水平时基调整、屏幕中心电平调整、模拟触发电平调整、负时间调整、平均值显示、频率测量显示、峰峰值显示;FFT模式包含:垂直尺度显示、采样率显示、屏幕中心电平显示、模拟触发电平显示、频谱最大分量(归一化值)显示、频标调整、频标对应分量显示。

(4)副界面包含5个其他功能:通道选择、波形/FFT模式切换、开启AUTO、模拟触发电平极性、开启单次(Single)模式。

2. 操作

(1)位于主界面的任意模式时,单击左右键可以使光标在该模式下可调整的功能间移动,转动旋钮调整被光标选中的参数;

(2)位于副界面时,单击左右键可以使光标在5个其他功能间移动,转动旋钮可以调整被选中的功能;

(3)按住旋钮的情况下:单击左键进入主界面、单击右键进入副界面。

(4)开启AUTO后,自适应调整只会在切回主界面后被执行一次;对新波形的自适应调整需要切到副界面——开启AUTO——切回主界面。

(5)开启Single后,无触发时,正常显示波形;触发一次后,波形与频谱均固定,并不会更新,但可以调整负时间和频标;在触发后,调整垂直尺度、水平时基、屏幕中心电平、模拟触发电平、采样率中的任意一者,都会导致下一次触发的捕捉。80301cb6-a917-11ec-952b-dac502259ad0.jpg8044a082-a917-11ec-952b-dac502259ad0.jpg80598f9c-a917-11ec-952b-dac502259ad0.jpg

项目需求分析

总的来说,本项目可以分为两个大的模块:GUI模块、采样处理模块。其中,相对于程序的主循环而言,采样处理模块是高速的、“同步”的,GUI模块是慢速的、“异步”的。两个模块间既需要并行不悖,又需要互相交换数据。 对于采样处理模块,主要考虑以下4个需求问题:1. ADC可控采样率与切换通道的实现;2. 触发电平的实现,以及负时间显示的实现;3. 如何对频率进行较高精度的测定;4. 如何计算信号频谱; 对于GUI模块,主要考虑以下3个需求问题:1. 如何以尽可能低的误判率获取按键与旋钮的信息;2. 中断服务函数所应干涉的范围;3. 如何以尽可能简洁的方式实现按键对GUI的改变 对于两个模块而言,最核心的问题是:如何在两者之间进行高效的数据传输的同时,避免数据的误判或漏判。

核心技术路线

针对“二”中提出的需求,以下同样分两个模块,对项目的技术路线进行完备的论述。鉴于HAL库过于庞大,且本人对项目的理解更偏重于硬件底层,除了HAL_Init,SystemClock_Config,以及与NVIC有关的3个最底层的函数(Priority, Enable, ClearPending)外,其他所有的外设配置代码,均为本人阅读器件手册后编写的寄存器代码。

1. ADC可控采样率与通道切换

在ADC连续模式下,虽然可以通过调整采样时间来调整采样率,但这样做显然并不好。一方面,这样得到的转换周期(Tsamp + 12.5ADC_Cycle)的倒数,即频率,往往是不规律的非整数,这样做不利于功能调整的层次化与统一化;另一方面,即使采用16MHz主频,在12位分辨率下,ADC最小转化频率也有16MHz / (160.5 + 12.5) ≈92.5kHz,有效测量范围太小。 定时器触发的方式是最好的选择。一方面,只需控制转换时间不大于采样率的倒数,就能获得完全可控的转换率;另一方面,这样有利于定时器触发DMA传输的引入。由于在32MHz主频下,即使是最简单的中断服务函数,频率也只能到150kHz左右,因此,DMA传输既可以提供较高的采样率,又可以使“采样——处理”分离的结构更加清晰。配置的方法: 对ADC端:

	
void ADC_init(void){  uint32_t temp;  RCC->IOPENR |= 0X1UL;//打开PortA时钟  temp=RCC->IOPENR;//时钟使能需等2个周期  UNUSED(temp);//避免Warning  //由于GPIOA->MODER对应位默认为0X3,即模拟输入  //因此不需要再额外配置PortA
  RCC->APBENR2 |= (0X1UL<<20UL);//打开ADC1时钟  temp=RCC->APBENR2;  UNUSED(temp);  ADC1->CR |= (0X1UL<<28UL);//使能内部参考电压  //自己写的延时,用TIM17的OPM模式  TIM17_Delay(1000-1,32-1);//等待参考电压有效  ADC1->CR |= (0X1UL<<31UL);  do  {    temp=ADC1->CR;//开始校正指令  }while(temp & (0X1UL<<31));//等待校正结束  ADC1->CFGR1 |= (0X1UL<<16 | 0X1UL<<12 | 0X2UL<<10 | 0X2UL<<6 | 0X0UL);  //(discontinuous,overwritten,ext rising edge,TRG2,DMA disabled);
  ADC1->TR1 &= ~(0X0FFF0000);  ADC1->TR1 |=  (0X0FFF0800);  //模拟看门狗的高低阈值  ADC1->CFGR1 |= (0X1<<26 | 0X1<<22 | 0X1UL<<23);  //AWD1 configuration  ADC1->CFGR2 |= (0X3UL<<30); //PCLK as ADC_CLK  ADC1->CHSELR |= (0X1UL << 1 | 0X0UL<<7);//选择通道一  do  {    temp=ADC1->ISR;  }while(!(temp & (0X1UL<<13)));//等待通道配置有效  ADC1->CR |= 0X1UL;//enabling ADC1  do  {    temp = ADC1->ISR;  }while(!(temp & 0X1UL));//ADC Ready  ADC1->CR |= 0X1UL<<2;//ADC Start  return;}
模拟看门狗的配置将在后面说明。这里最关键的,一是必须配置为非连续模式、外部上升沿触发,选择TIM2的TRGO为触发源,并且不能选择ADC为DMA触发源,否则ADC的overwritten特性会迫使软件屡屡清除标志位,以保证DMA Request的持续产生;二是在外部触发时,必须先start。806cdcc8-a917-11ec-952b-dac502259ad0.jpg80807a4e-a917-11ec-952b-dac502259ad0.jpg 对DMA端:

	
void ADC_DMA_init(void){  uint32_t temp;  RCC->AHBENR |= 0X1UL;  temp=RCC->AHBENR;//时钟使能需2个周期  UNUSED(temp);//避免Warning  DMA1_Channel1->CPAR = (uint32_t)(ADC1_BASE+0X40);  DMA1_Channel1->CMAR = (uint32_t)(&dat_buf);  DMA1_Channel1->CNDTR = ADC_MAX * 2;  DMA1_Channel1->CCR |= (0X2UL<<12 | 0X1UL<<10 | 0X2UL<<8 | 0X1UL<<7 |       0X0UL<<3 | 0X1UL<<1 | 0X1 << 5);      //v-high priority, m-size=16,p-size=16,m-increase,      //error and complete interrupt, circular mode;  DMAMUX1_Channel0->CCR &= ~(0X7FUL);  DMAMUX1_Channel0->CCR |= (0X1FUL);//tim2 as request source  __NVIC_SetPriority(DMA1_Channel1_IRQn,0);  __NVIC_EnableIRQ(DMA1_Channel1_IRQn);  DMA1_Channel1->CCR |= 0X1UL;//enable DMA channel  return;}
传输数据使用的是通道一。相比于F407等系列,G031引入了DMAMUX的概念,使得几乎所有的外设和一些事件都可以在任意一个DMA通道上产生请求。由于DMAMUX的0~4对应DMA的1~5,查阅用户指南后,得知设置DMAMUX的CCR的低7位为31(0X1F)表示TIM2的Update。 对TIM端:

	
void TIM2_Init(unsigned int priority){  uint32_t temp;  RCC->APBENR1 |= 0X1UL;//使能TIM2时钟  temp=RCC->APBENR1;  UNUSED(temp);  //TIM2->DIER |= 0X1UL;//允许更新中断  TIM2->CR1 |= 0X1UL<<2UL;//手动更新不触发中断  TIM2->CR2 |= 0X2<<4;//update as TRGO  TIM2->SMCR |= 0X1UL<<7;  TIM2->DIER |= 0X1UL<<8;  TIM2->ARR = 16-1;  TIM2->PSC = 0;  temp=TIM2->ARR;  TIM2->EGR |= 0X1UL;//手动更新寄存器值  temp=TIM2->PSC;  UNUSED(temp);}
通过CR2的主模式位MMS[6:4]配置TIM2的Update为TRGO,否则无法正确触发ADC;使能更新事件的DMA请求。 在上述框架下,DMA只要开启单次模式,等待全传输中断函数置标志位就可以了。需要注意的是,在清除中断标志的时候,需要同时清除NVIC端和外设端的标志位,否则会陷入无限的中断循环。 若开启了上述外设配置,则上述架构在DMA One shot模式下就能完成采样率可调的循环数据传输。而我们最终开启的是DMA Circular模式,这将在后面说明。

2. 触发电平的实现,以及负时间的实现

触发电平,即以被测信号越过某个阈值电压为起算点,采集后面的若干个数据。该方法可以使波形稳定地显示在屏幕上。 负时间,即可以显示触发电平前一定时间内的波形。当触发电平用于异常信号的单次捕捉(Single模式)时,负时间可以显示异常信号前的波形。 有同学在无条件采样后计算一组数据的均值(中值),并显示从中值样点开始的数据,从而通过软件实现触发电平。这种方案在实现AUTO时不失为一个好的启发,但在此面临两个问题:第一,单纯的中值判断无法控制触发的极性,即无法选择上升沿还是下降沿触发。若增加前后值判断,则将增加软件运算量;第二,这种算法下不可能出现“无触发”的、波形乱晃的现象,与真实的数字示波器存在差异。从本质上讲,这种方法没有充分利用硬件底层。 G031的ADC自带一个模拟看门狗,即Analog Window Watchdog的特性。即当采样值超出规定范围(窗口)时,输出AWD_OUT将持续拉高,直至电压落回窗口内,延迟为一个转换周期。8092b4ac-a917-11ec-952b-dac502259ad0.jpg并且,这个信号是硬件连接(hardwired)至TIM1的外部触发MUX的。它可以通过TIM1的AF1寄存器被选择为TIM1的从模式外部触发信号。80a518e0-a917-11ec-952b-dac502259ad0.jpg

配置TIM1从模式为Trigger Mode(上升沿触发启动)、选择触发源为外部触发ETR,再连接AWD1至ETR,就可以在DMA One Shot模式下,实现基于硬件的、真正的触发电平功能。通过ADC的TR1设置阈值,假设TIM1为上升沿启动,则当窗口为(x , 0x0FFF)时,为下降沿触发;当窗口为(0x0000 , x)时,为上升沿触发。
80b64160-a917-11ec-952b-dac502259ad0.jpg

然而在这样的结构下,是无法实现负时间功能的。由于AWD_OUT的上升沿是不可预知的随机事件,因此应该对程序结构进行微调:改用DMA Circular模式,AWD_OUT作为采样停止——而不是开始——的信号。 假如我们希望采集触发后的256个数据(为方便FFT运算),又希望显示负时间的128个数据,则应该配置TIM2为ADC触发源,令TIM1的溢出周期为TIM2的256倍。在TIM1的中断服务函数中关掉(Disable)TIM2,就能实现上述功能。与此同时,DMA1_Channel1的CNDTR中将保存一个循环中剩余待传输的数据个数,据此可以定位连同负时间在内的整段有效数据在DMA目标数组内的起止位置。

80c4e1e8-a917-11ec-952b-dac502259ad0.jpg

若目标数组大小为512,当TIM2停止时,CNDTR的值为CH1_CNDTR,则触发点下标应为(512 - CH1_CNDTR - 256) % 512= (512 - CH1_CNDTR + 256) % 512= (768 - CH1_CNDTR) % 512 然而这样的设计存在一个问题:模拟触发事件具有随机性,如果它在重新开启TIM2后的几个周期内就发生,那么当新一段数据被存储完成后,负时间位置的数据还是上次采样的数据,这就会导致负时间显示错误。

80d7dd52-a917-11ec-952b-dac502259ad0.jpg


为了避免上述情况,在新一轮开启后,必须先等待一次全传输中断再开启TIM1。事实上,只要一次全传输中断后,无论TIM1隔多久开启,数组中的时间轴都是连续的。用dat_buf_ready的bit0表示全传输中断、bit7表示TIM1中断。

	
if((!(cursor_buf & (0X1 << 7))) || ((cursor_buf & (0X1 << 7)) && (single_flag == 0)))    {      TIM1->ARR = TIM2->ARR;      TIM1->PSC = (TIM2->PSC + 1) * 256 - 1;      TIM1->EGR |= 0X1;      {        DMA1_Channel1->CNDTR = ADC_MAX * 2;        DMA1_Channel1->CCR |= 0X1UL;        TIM1->SR &= ~(0X1UL);        TIM2->CR1 |= 0X1UL;      }
      while(!(dat_buf_ready & 0X01))      {      }      TIM1->DIER |= (0X1UL);      TIM1->SMCR |= (0X0UL<<16 | 0X6UL);      dat_buf_ready &= ~(0X1);    }void TIM1_BRK_UP_TRG_COM_IRQHandler(void){  CH1_CNDTR = DMA1_Channel1->CNDTR;//赋值了不一定用,但这样最准确  if(TIM1->SR & 0X1UL)  {    {      TIM2->CR1 &= ~(0X1UL);      TIM1->CR1 &= ~(0X1UL);      //Stop tim2 and consequently stop DMA      TIM2->CNT = 0;//resetting TIM2      dat_buf_ready |= 0X1 << 7;//setting complement flag    }    TIM1->SR &= ~(0X1UL);    __NVIC_ClearPendingIRQ(TIM1_BRK_UP_TRG_COM_IRQn);  }}void DMA1_Channel1_IRQHandler(void)//中断服务函数{  DMA1->IFCR |=0X1UL;  dat_buf_ready |= 0X1;  __NVIC_ClearPendingIRQ(DMA1_Channel1_IRQn);}
3. 信号频率的测定


数字测定频率的方法,一般是先整形再测量。即通过施密特触发器(比如TLV3501)先把信号整形成脉冲,再对脉冲进行测定。对脉冲的测定也有两种思路:一是直接同步采样后计算脉冲个数,适用于较高频率;二是计算脉冲高低电平的周期个数,适用于较低频率。两种方法均受限于系统最高主频。这也是本项目至今为止两个尚为得出最优解的难点之一。 本项目从脉冲整形到计数均采用硬件特性为主、软件程序为辅的思路。根据前面的讨论可知,ADC的AWD在一定频率以下等效于一个极其理想的脉冲整形器。相较于模拟施密特触发器,其最大的特点在于脉冲整形的响应特性与信号峰峰值的绝对值无关,而仅受到信道噪声和量化噪声的干扰。因此,测量频率最基本的方法,也是本项目采用的方法,就是对AWD的输出信号AWD_OUT在一定时间内进行计数。此方法实现起来最为简单,但面临两个很大的问题:第一,相比于FPGA广泛采用的双闸门法,此方法会把闸门时间的前后沿漏掉,引入一定的误差,但这并非主要矛盾。80ec4530-a917-11ec-952b-dac502259ad0.jpg


第二,实测表明,在测定较低频率的正弦波或三角波时,频率将出现较大误差,只有对方波的测定最为准确。这种误差只有在200Hz以上才可以忽略不计。究其本质,是因为信号的噪声抖动所致。AWD_OUT的灵敏度带来了一个致命的缺点:没有任何的滞回特性,这就导致在过触发点附近的任何噪声都可能被极大地放大,只有边沿极抖的方波才能“幸免”。反观模拟脉冲整形电路,由于人为设计滞回电路以及电路本身输入输出电容的存在,对输入信号总有一定的消抖能力。当然,用于传输测试信号的信道本身也存在问题。一方面,用于输出测试信号的手持信号源输出的信号可能质量欠佳;另一方面,相比于“BNC——同轴线——SMA”信道,“鳄鱼夹——杜邦线——排针”信道的明显劣势也是不言而喻的。 一定程度上减弱抖动影响的措施,唯有通过定时器自带的数字滤波器,对AWD输出信号进行数字滤波。但实验证明,若用2Msps的速率采集峰峰值3.0V的正弦波,即使采用最大滤波长度,依然会将10Hz误测成100Hz左右,而在滤波前,误测值高达2kHz左右。由于后续AUTO功能的需要,测量频率和数据采集是分开的。也即频率测量与时基无关。

	
if((!(cursor_buf & (0X1 << 7))) || ((cursor_buf & (0X1 << 7)) && (single_flag == 0)))//测量频率        {       //配置参数        //保存TIM2原参数,并设为2MHz采样率        arr = TIM2->ARR;        TIM2->ARR = 16 - 1;        smp = (ADC1->SMPR) & 0X7;        ADC1->SMPR &= ~(0X7);        ADC1->SMPR |= 0X1;        psc = TIM2->PSC;        TIM2->PSC = 0;        //将TIM1的从模式更改为External Clock 1        //并打开数字滤波        TIM1->SMCR &= ~((0X1 << 16) | 0X7);        TIM1->SMCR |= 0X7;        TIM1->SMCR |= 0XF << 8;        TIM1->PSC = 0;        TIM1->ARR = 65535;        TIM1->CNT = 0;        TIM1->EGR |= 0X1;
        //配置SysTick        SysTick->VAL = 0;        SysTick->LOAD = 16000000 -1;
        //开启测量        TIM2->CR1 |= 0X1;        TIM1->CR1 |= 0X1;        SysTick->CTRL |= 0X1;        while(!(SysTick_UE_FLAG & 0X1))        {        }        //结束测量,恢复TIM1参数        TIM1->CR1 &= ~(0X1);        TIM2->CR1 &= ~(0X1);        SysTick_UE_FLAG &= ~(0X1);        TIM1->SMCR &= ~((0X1 << 16) | 0X7);        TIM1->SMCR &= ~(0XF << 8);      }
4. 如何计算信号频谱


本项目的FFT算法没有调用任何除C++标准库以外的库,这一方面是考虑到RAM空间的紧张,另一方面则是起到锻炼的作用。 本项目的FFT算法就是最简单的256点基-2 FFT算法,将复数乘法拆分为实虚部进行同址运算,并将FFT因子存储为const型常量。


81047ab0-a917-11ec-952b-dac502259ad0.jpg


基-2 FFT的蝶形算子概念在DSP教材中均有解释,本项目完全依照其定义与原理编写。以上完成了采样处理模块的论述,下面将进行GUI模块的论述。 鉴于本项目具有一定的复杂性,我们将GUI模块又分为两部分:一是用户交互部分,即按键和旋钮及与之相关的中断服务函数,二是显示部分,即OLED屏驱动以及主循环。为了避免使程序过于复杂,用户交互部分并不能直接、即时地改变显示部分,用户的操作将被保存在由几个变量模拟成的寄存器的各个位里,并被主循环的固定部分重复读取、刷新。各寄存器及其各位的定义如下。811bca12-a917-11ec-952b-dac502259ad0.jpg


各个位的含义及位置,均以宏定义的形式在头文件中声明。这样,就可以在刷新函数中通过位运算的方式获取各个参数。

	
//macros for register ui_buf#define CH_SEL_BIT_OFFSET (0)#define CH_SEL_BIT (0X1 << CH_SEL_BIT_OFFSET)
#define FFT_ON_BIT_OFFSET (1)#define FFT_ON_BIT (0X1 << FFT_ON_BIT_OFFSET)
#define TRG_POL_BIT_OFFSET (2)#define TRG_POL_BIT (0X1 << TRG_POL_BIT_OFFSET)
#define AUTO_ON_BIT_OFFSET (3)#define AUTO_ON_BIT (0X1 << AUTO_ON_BIT_OFFSET)
#define TIME_BASE_BITS_OFFSET (4)#define TIME_BASE_BITS (0XF << TIME_BASE_BITS_OFFSET)
#define AMP_DIV_BITS_OFFSET (8)#define AMP_DIV_BITS (0XF << AMP_DIV_BITS_OFFSET)
#define NEG_TIME_BITS_OFFSET (12)#define NEG_TIME_BITS (0X7F << NEG_TIME_BITS_OFFSET)
#define TRG_LV_BITS_OFFSET (19)#define TRG_LV_BITS (0X7F << TRG_LV_BITS_OFFSET)
#define BIAS_BITS_OFFSET (26)#define BIAS_BITS (0X3F << BIAS_BITS_OFFSET)
这样做的显著好处就是极大地节省了RAM空间。因为最小的变量也是8位,却没有任何参数达到256档之多,尤其是那些只有一位的标志位,完全没有必要用8位变量表示。当然,这又是一对用时间换空间的矛盾。因为位运算的操作量是直接赋值运算的3倍,这是在内存空间紧张的情况下最好的选择。


5. 如何以尽可能低的误判率获取按键和旋钮的信息


由硬件电路可知,旋钮的AB相、旋钮按键、左右按键,分别连接在PB4,PA15,PB3,PA4,PA5上。其中,三个按键只要用外部中断+延时消抖就能很好地判断,而旋钮则具有一定的复杂性。

81345ac8-a917-11ec-952b-dac502259ad0.jpg

我们判断旋钮不应选择上升沿,这是由旋钮的硬件特性决定的。出于简化考虑,本项目只对PA15的下降沿做了外部中断,即:根据下降沿时PB4的电平高低来判断左旋或右旋,但这带来的问题也很明显:如果旋钮被误转了一半,那么即使松开复原了,也会被判定为一次转动——这往往发生在用户完成一次有效转动之后,由于惯性而导致的误触。 事实上,正确的做法应该是:用TIM3的CC1来捕捉PB4(以此避开与PA4在EXTI Line4上的冲突),用EXTI Line15来捕捉PA15。只要两个中断服务函数共享一个全局变量,就可以解决误触的问题。 由下图(在下一页)可以看出,除了切换主副界面以外,按键和旋钮并不会直接去动那6个全局变量寄存器。而主副界面的“切换”也只是动了一个位M_S_FLAG,真正的显示更新在主循环中完成。除此之外,按键和旋钮的加、减被记录在变量add_buf和min_buf中,而因为按键和旋钮都可以进行加减操作,因此用flag寄存器的0位和7位来表示究竟是按键按下,还是旋钮转动。为了避免抖动,在PA15外部中断时,add_buf和min_buf只有一个能被置位,而置位它的同时将强行清零另一个,也算是一个简单的软件消抖。这其实也回答了需求中提出的第二个问题:中断服务函数只改变加减标志位,而不改变全局寄存器,否则整个服务函数将因充斥各种逻辑判断而变得十分冗长与庞大,以至于喧宾夺主。

	
void EXTI4_15_IRQHandler(void){  if(EXTI->FPR1 & (0X1 << 15))  {    flag |= 0X1 << 7;    if(!(GPIOB->IDR & (0X1 << 4)))    {      add_buf ++;      min_buf = 0;    }    else    {      min_buf ++;      add_buf = 0;    }    TIM17_Delay(5000-1,320-1);    EXTI->FPR1 |= 0X1 << 15;  }  if(EXTI->FPR1 & (0X1 << 4))//left key down,--, or switch to main ui  {    TIM17_Delay(5000-1,320-1);    if(!(GPIOA->IDR & (0X1 << 4)))    {    flag |= 0X1;    if(GPIOB->IDR & (0X1 << 3))//PB3 not down    {      if(!(M_S_FLAG & cursor_buf))//main ui      {        if(!(ui_buf & FFT_ON_BIT))        {          if((cursor_buf & M_UI_BITS) > 0)            cursor_buf -= 0X1 << M_UI_BITS_OFFSET;        }        else        {          fft_col |= 0X1 << 7;//变量标志位        }      }      else//sub ui      {        if((cursor_buf & S_UI_BITS) > 0)          cursor_buf -= 0X1 << S_UI_BITS_OFFSET;      }    }    else//PB3 down    {      cursor_buf &= ~(M_S_FLAG);    }    }    EXTI->FPR1 |= 0X1 << 4;  }  if(EXTI->FPR1 & (0X1 << 5))//right key down,++, or switch to sub ui  {    TIM17_Delay(5000-1,320-1);    if(!(GPIOA->IDR & (0X1 << 5)))    {    flag |= 0X1;    if(GPIOB->IDR & (0X1 << 3))//PB3 not down    {      if(!(M_S_FLAG & cursor_buf))//main ui      {        if(!(ui_buf & FFT_ON_BIT))        {          if((cursor_buf & M_UI_BITS) < (0X4 << M_UI_BITS_OFFSET))            cursor_buf += 0X1 << M_UI_BITS_OFFSET;        }        else        {          fft_col &= ~(0X1 << 7);        }      }      else//sub ui      {        if((cursor_buf & S_UI_BITS) < (0X4 << S_UI_BITS_OFFSET))          cursor_buf += 0X1 << S_UI_BITS_OFFSET;      }    }    else//PB3 down    {      cursor_buf |= M_S_FLAG;    }    }    EXTI->FPR1 |= 0X1 << 5;  }  __NVIC_ClearPendingIRQ(EXTI4_15_IRQn);}
6. 如何以尽可能简洁的方式实现按键对GUI的改变


由上述讨论可以看出,最简洁的方式就是在每次进入主循环后的固定位置,根据6个全局寄存器的值,共同决定本次循环应该在屏幕上显示什么,并清除所有的标志位。由于实现该功能的UI_Refresh函数太长,这里仅以一个switch-case分支作为示例。

	
case (0X1 << M_UI_BITS_OFFSET)://水平分格{  flag |= 0X1 << 2;  if(add_buf && ((ui_buf & TIME_BASE_BITS) < (0XF << TIME_BASE_BITS_OFFSET)))  {    add_buf = 0;    ui_buf += (0X1 << TIME_BASE_BITS_OFFSET);  }  else if(min_buf && ((ui_buf & TIME_BASE_BITS) > (0X1 << TIME_BASE_BITS_OFFSET)))  {    min_buf = 0;    ui_buf -= (0X1 << TIME_BASE_BITS_OFFSET);  }  break;}事实上,这是本项
目至今没有完全得出优化解的另一个难点。虽然这样的结构很简洁,但我们后续就将看到:这种完全“同步”于主循环,而屏蔽任何“异步”带来的后果,就是当水平时基很大时,整个程序也会变得非常缓慢,以至于几乎进入了一种“假死”状态。因为即使按下了按键,至少也要等一次主循环结束。而在以低的采样率采集数十Hz信号时,连同等待触发加256个采样点在内的时间,是相当可观的。这启示我们,中断服务函数应该真的具有“中断”的作用,而不仅仅是完成一个硬件电路就可以实现的状态机。至于采样处理模块的更新,则与GUI的更新如出一辙:同样是根据6个全局寄存器的值来更新,这样保证了显示与实际相符。只不过这一次更新的是模拟开关档位、TIM2溢出频率,TIM14与TIM16的PWM波占空比等参数。

其他功能简述

在核心部分以外,以下将对AUTO,Single以及波形显示函数作简要的论述。


1. AUTO功能

所谓的AUTO功能,是指示波器根据当前被采信号的直流偏置、峰峰值、频率等特点,自动调节显示时基、触发电平、垂直尺度等参数,使得整个波形尽可能以最大的完整度和占满率显示在屏幕上。 在本程序中,频率的测定与采样时基无关,这对AUTO的实现无疑是有利的。而由于输入端采用了反相放大(衰减)器加同相端直流偏置的方式,而不是在同一端接成加法器,因此直流偏置的概念本身变得模糊。

81450a12-a917-11ec-952b-dac502259ad0.jpg

上图为输入端电路。其中Vi为真实输入值,Vo为ADC实际采到的值。据此,我们可以得出如下映射关系:

815b95ca-a917-11ec-952b-dac502259ad0.jpg


根据这个关系,就能根据ADC采样值反推出真实的电压。在AUTO时,我们首先将触发电平选在屏幕中心(即Xadc = 2048,Vo = 1.65V),然后求出真实输入电压的中值(而不是均值,因为,如果输入的是90%占空的方波,那么中值作为触发的效果显然比均值要好),最后,通过解方程的方式,反推出TIM16或TIM14应该输出的PWM波占空比,就能使波形以中值附近为中心显示在屏幕上。 AUTO模式不能和FFT模式以及Single模式一起开启。 每次在副界面打开AUTO后,AUTO指令只会被执行一次。在AUTO后,任何除查看负时间(波形模式)和频标(FFT模式)以外的操作均会解除AUTO。每次要执行新一次AUTO,需要切换副界面——保证AUTO处于OFF——再将AUTO调至ON。


2. Single单次模式


在打开Single模式时,示波器会在一次触发之后将波形冻结。此时可以切换主副界面,在频谱和波形显示之间切换、查看负时间(波形模式),以及调整频标查看各分量大小(FFT模式)。除此之外的任何操作都会解除冻结,并自动等待与捕捉下一次触发。Single模式不能和AUTO模式一起开启。

3. 波形显示函数


与大多数人不同,本项目的波形显示函数没有调用DrawLine,而是用了自己编写的另一个基于底层的方法。这样做的初衷是为了进一步验证自己对OLED底层驱动的理解,并试图通过自己编写的显示函数来避免移植库中显存的使用。然而事实证明,显存的存在有其优势,且自己建立一套字模就好比天方夜谭。 尽管在8KB RAM的开发板上,2KB的显存不免奢侈,但显存的概念本身——尤其是在缓存以避免频闪上——是很重要的。对于一些更高阶的开发板(如F407)系列,显存将被外扩SRAM硬件实现。一个典型的例子就是EMWIN库。 本程序采用的函数,主要是讨论一种底层驱动的方法。 绘制波形的确可以用DrawLine,然而也可以采用不同的思路。 因为波形一定是以相邻两个点为步进,一个一个点绘制的,也就是说,这本质上不是一个通用的DrawLine问题,而是一个x轴步进固定为1的特殊的DrawLine问题,那么这个问题就可以有不同的解法。我们可以认为:第i点与第i+1点的数值,共同决定了第i+1列的显示。但它们不能影响第i列的显示。 这要从我们调用的底层讲起。板载的这款OLED有两种寻址模式:一是写入0X20指令后的列自增寻址,即选定页地址和列地址后连续写入,页地址固定而行地址自增;二是写入0X21指令后的页自增寻址,即选定页地址和列地址后连续写入,页地址自增而行地址固定。波形绘制使用的就是不同于常规的0X21指令。 可以想象,每次更新波形时,是一列一列进行的。先清除一列上已有的波形,再显示新的波形(注意这是直接写进OLED里,而不是显存里的,因此无法进行“ |= ”运算)。如果第i点和第i+1点共同决定第i列和第i+1列的显示,那么同理,第i-1点和第i点也将共同决定第i-1列和第i列的显示。这样就会导致第i列在显示上出现矛盾:后面的会把前面的冲掉。一个典型的例子就是:在显示方波时,这种方法会导致所有的沿显示为空白。因此,要想达到显示波形的效果,只需要简单地在第i+1列上,填充第i点的行与第i+1点的行之间的全部行就可以了。而在后续显示示波器分格的虚线、触发电平虚线,以及负时间或频标虚线时,只要通过简单的位运算和或运算,在恰当的行与列将虚线的每个像素点与波形数据进行“或”运算即可。



总结与思考

由于此前完全没有独立进行过这种完整项目的开发,更没有试过完全摆脱库函数的束缚,直接对着器件手册进行寄存器编程,因此从这个意义上讲,这次项目实践的收获无疑是丰硕的。 寄存器编程的巨大好处不仅仅在于证明自己有不再跟着别人编写的库函数亦步亦趋的能力,而更多地在于对单片机的硬件特性本身有了更加深入和透彻的理解。单是觉得看懂了器件手册却不会根据自己对它的理解进行编程,抑或单是学会用库函数拼凑出各种功能而不知其所以然,在我看来都不是学习嵌入式最终的目的。换句话说,我既不想像“嵌入式接口技术”课那样,花一个学期背完一份考纲,也不想把嵌入式开发玩成一个纯软件的东西。 这其中当然也掺杂着很大的个人因素。在参加电赛的一年半里,我已经受够了在那些被奉为神谕的库函数面前不得不唯唯诺诺的姿态,为此我还我曾经干出过这样的蠢事:每次新建一个工程,就把所有相关的外设驱动库函数复制一份过去,以至于锐减的E盘容量呈现出一派日积月累和勤学苦练的虚假繁荣——全都是泡沫经济罢了。 性格执拗与固执行事,就好比在众目睽睽之下丢开大路不走,而非要在泥潭水沟里摔得鼻青脸肿,比的就是在他人的冷嘲热讽与自己的自我怀疑中,哪个会先让你破防。别人看了视频,用一行代码一分钟就点亮的灯,我却花了半天还差点没累死在电脑前,换来的是两个刻骨铭心的知识点:配置外设前要先打开RCC的时钟位,以及GPIO MODER的复位值是全1而不是全0。当绿灯亮起来的那一刻,我才深切地意识到,自己还有很长的路需要走。 我的另一个教训在于低估了GUI设计的难度。在2月9号完成了核心部分的架构之后,我天真地以为只要享受接下来的过程就好了,殊不知行百里者半九十,真正魔鬼的东西,恰恰还在后头。时至今日,我虽然好歹结了个项,但心中的满足简直微乎其微。程序跑出来的整体结果很不理想,单纯的实现功能与不恶心你的用户之间,隔的真不是一两条鸿沟。在敲完代码后,我才意识到是否应该引入一个简单的操作系统来实现一个更加人性化的GUI,因为挫败使我意识到:这种“睁眼主循环,闭眼进中断”的思维,可能确实有点太单细胞了。 除此之外,实现一个示波器所需的各种基本功能,我也有了一个大体的理解。知识决定想象力的范畴,这与我一贯的认知相符——毕竟在此之前,我也只限于纸上谈兵地构建一款拥有各种功能示波器,却每每止步于“这个功能理论上可以实现”。然而当我试图把自己的想法变为现实,理论和实际的差距才会一次次地刷新我的认知:别人说起来轻描淡写的东西,始终都只是别人的。 后续的改进我不会在这个项目的基础上完成,而会在一个去年遗留下来的产学合作项目中,转移到F407和G031构成的双MCU结构(我都没脸说“双核系统”,真的)上完成。至于这个平台,它还有实验价值。我还得用它来搞清楚,为什么用外部时钟驱动计时器时,溢出更新无法触发DMA——这是我在本次寄存器编程中唯一一个尚未解释清楚的问题。

原文标题:如何使用STM32G031开发板实现双通道示波器-2022年寒假在家练STM32平台项目分享(一)

文章出处:【微信公众号:电子森林】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红
  • 示波器
    +关注

    关注

    99

    文章

    3181

    浏览量

    170882
  • 参数
    +关注

    关注

    9

    文章

    950

    浏览量

    28490
  • 开发板
    +关注

    关注

    17

    文章

    2325

    浏览量

    85282
收藏 人收藏

    评论

    相关推荐

    小成本的V853 AI小开发板DIY设计

    全志最新发布的V853芯片拥有1T的NPU算力,还有Arm+RISC-V+NPU三核异构和丰富的音视....
    的头像 全志在线 发表于 08-10 17:36 29次 阅读

    3V与5V电平不兼容引起的故障

    看如下设计:晶振产生4M的振荡,送到4040中分频,其中2分频,11分频和12分频输出送到与门中,与....
    的头像 冬至配饺子 发表于 08-10 16:57 24次 阅读
    3V与5V电平不兼容引起的故障

    适用于任何预算的前7款USB示波器

    体积小、基于 PC 的 USB 示波器功能齐全,可为您提供所需的经济高效、高性能且易于使用的示波器
    发表于 08-10 15:28 13次 阅读

    君正T30开发套板产品手册

    君正 T30A 开发套板采用的是君正 T30A 处理器,基于当前主流趋势即音视频融合计 算,君正 T....
    发表于 08-10 15:11 4次 阅读

    开发板ESP8266开源分享

    电子发烧友网站提供《开发板ESP8266开源分享.zip》资料免费下载
    发表于 08-10 14:49 3次 阅读
    开发板ESP8266开源分享

    基于STM32F103C8T6 CBT6的DAPLink

    电子发烧友网站提供《基于STM32F103C8T6 CBT6的DAPLink.zip》资料免费下载
    发表于 08-10 14:39 3次 阅读
    基于STM32F103C8T6 CBT6的DAPLink

    制作一个基于ATtiny13的迷你开发板

    电子发烧友网站提供《制作一个基于ATtiny13的迷你开发板.zip》资料免费下载
    发表于 08-10 11:57 6次 阅读
    制作一个基于ATtiny13的迷你开发板

    开发板STM32H750开源分享

    电子发烧友网站提供《开发板STM32H750开源分享.zip》资料免费下载
    发表于 08-10 10:39 7次 阅读
    开发板STM32H750开源分享

    示波器有什么用?

    示波器分模拟示波器与数字示波器,我们这里讲的主要是数字示波器。信号进来,经过ADC(模数转换),对信....
    发表于 08-10 09:50 54次 阅读
    示波器有什么用?

    PLEX控制器的资料分享

    描述 PLEX控制器 PLEX 是使用 Arduino UNO 引导加载程序的开发板,可通过 Arduino IDE 轻松编程。该板具有许多...
    发表于 08-10 06:39 107次 阅读

    全志V853开发板--buildroot应用交叉编译

    全志V853-高性能边缘AI视觉处理芯片 V853 是一颗面向智能视觉领域推出的新一代高性能、低功耗....
    的头像 Rice嵌入式开发技术分享 发表于 08-09 17:56 356次 阅读

    鸿蒙HiSpark IPC DIY Camera开发板免费试用啦,想要申请的小伙伴看过来啦!

    各位开发者看过来了,还没有试用过这块鸿蒙IPC开发板的开发者机会来了,现在免费发放给大家试用,现在只需要在本贴评论区进行...
    发表于 08-09 16:39 2421次 阅读

    科普一下示波器的四大基本指标

    示波器测量上升时间时可视为一个线性级联系统。据信号与系统的相关结论可知: 级联系统的冲激响应等于组成....
    发表于 08-09 15:52 34次 阅读
    科普一下示波器的四大基本指标

    A182型Hi3516DV300开发板快速入门手册

    本文为 Hi3516CV500/Hi3516DV300/Hi3516AV300 SDK 的安装及升级....
    发表于 08-09 15:50 3次 阅读

    物联网开发板

    电子发烧友网站提供《物联网开发板.zip》资料免费下载
    发表于 08-09 15:14 6次 阅读
    物联网开发板

    如何使用示波器测试电池的瞬态能量

    今天为大家带来用示波器的函数计算功能,测试一个电池的瞬态能量。
    的头像 博宇讯铭 发表于 08-09 15:01 331次 阅读
    如何使用示波器测试电池的瞬态能量

    DS100 Mini数字示波器

    前言 本篇文章主要评测正点原子的DS100 Mini数字示波器在实际的项目中能不能胜任。 示波器的配....
    的头像 Rice嵌入式开发技术分享 发表于 08-09 11:17 17次 阅读

    GD32F310开发板试用--基于RTT Nano的RTT软件包使用

    概述 很高兴再次参加ARM中国的评测活动,本次活动是评测GD新出的一款M4内核的芯片--GD32F3....
    的头像 Rice嵌入式开发技术分享 发表于 08-09 11:17 213次 阅读

    全志V853开发板应用实例--构建编译

    全志V853-高性能边缘AI视觉处理芯片 V853 是一颗面向智能视觉领域推出的新一代高性能、低功耗....
    的头像 Rice嵌入式开发技术分享 发表于 08-09 11:17 81次 阅读

    FPGA与STM32开发板开源

    电子发烧友网站提供《FPGA与STM32开发板开源.zip》资料免费下载
    发表于 08-09 11:00 13次 阅读
    FPGA与STM32开发板开源

    【产品介绍】武汉芯源Cortex-M0+通用 MCU CW32F系列产品介绍

    Cortex-M0+ 通用 MCU CW32F系列家族型号展示 2021年10月14日,经过多年的市场调研和潜心研发,武汉芯源半导体自主研发...
    发表于 08-09 10:17 170次 阅读

    FPGA与MCU单片机的综合开发板开源

    电子发烧友网站提供《FPGA与MCU单片机的综合开发板开源.zip》资料免费下载
    发表于 08-09 09:41 10次 阅读
    FPGA与MCU单片机的综合开发板开源

    STM32F401RB RET6开发板开源

    电子发烧友网站提供《STM32F401RB RET6开发板开源.zip》资料免费下载
    发表于 08-09 09:33 11次 阅读
    STM32F401RB RET6开发板开源

    Nano-BRK V2开发板资料分享

    描述 Nano-BRK V2 Nano-BRK 是我为 Arduino 准备的第一个公开发布板。该板非常小,并且有多个用于插头引脚的电源选项...
    发表于 08-09 07:22 477次 阅读

    想用ch573/571做蓝牙键盘、鼠标,相关例程哪里下载?

    另外开发板用哪个   
    发表于 08-09 07:14 42次 阅读

    功率放大器的设计方法

    设计电路,利用Multisim软件绘制电路原理图。
    发表于 08-08 17:13 140次 阅读
    功率放大器的设计方法

    Hi353 1DV200开发板

    海思 Hi353 1D V200 是针对多路高清/超高清( 1080p/4M/5M/4K) DVR ....
    发表于 08-08 15:36 6次 阅读

    润和HH—SCDAYU200开发套件开发资料免费下载

    产品简介 HH—SCDAYU200开发套件是基于瑞芯微RK3568设计的一款人工智能开发板,板载四核64位Cortex—A55处理器,采...
    发表于 08-08 14:26 975次 阅读

    开鸿智谷NiobeU4开发板开发原理图+数据手册

    一、产品概述 NiobeU4是基于乐鑫ESP32芯片,由拓维信息旗下湖南开鸿智谷数字产业发展有限公司推出的一款高性价比、多功能,...
    发表于 08-08 14:05 4545次 阅读

    天启教育M1开发板开发教程:编程篇-天启主板Python接口

    1.1、天启主板外设接口 import模块名: tqmain 1.1.1、点阵屏使能控制 函数用法: tqmain.matri_enable(enable) 功能描述:点...
    发表于 08-08 11:36 602次 阅读

    ESP8285 WiFi模块满载开发板

    描述 ESP8285 WiFi模块满载开发板 用于 ESP8285 WiFi 模块的简单但满载的开发板/编程器。 嵌入所有必要的组件来编程...
    发表于 08-08 08:00 591次 阅读

    Esp32相机开发板资料分享

    描述 Esp32相机开发板,适用于所有基于图像处理的项目,带有传感器监控和控制输出设备。 PCB+原理图 ...
    发表于 08-08 06:46 548次 阅读

    比较器的输入共模电压范围技术解析

    比较器的输入级限制了输入 VCM。让我们首先看一下 TL331 数据表中的功能方框图(图 3)。输入....
    发表于 08-06 17:17 142次 阅读

    知用电流探头连接示波器的操作指南

    知用电流探头能与市面上所有品牌的示波器兼容使用,如泰克、是德科技、力科、普源等知名品牌。为了准确方便....
    的头像 PRBTEK 发表于 08-05 13:50 231次 阅读
    知用电流探头连接示波器的操作指南

    知用高压差分探头操作及保养注意事项

    知用高压差分探头在各种应用中得到广泛使用,可以为当今的高速功率测量、车载总线测量和数字系统设计提供出....
    的头像 PRBTEK 发表于 08-05 13:49 62次 阅读

    AVR328开发板项目

    电子发烧友网站提供《AVR328开发板项目.zip》资料免费下载
    发表于 08-05 10:05 8次 阅读
    AVR328开发板项目

    电源设计说明:如何测量纹波

    如果输出信号受到纹波的影响,开关转换器的性能会显着降低。它的存在在光谱仪中非常明显。减少输出纹波和开....
    发表于 08-05 10:00 52次 阅读
    电源设计说明:如何测量纹波

    运放参数的详细说明和分析

    一般运放的datasheet中会列出众多的运放参数,有些易于理解,我们常关注,有些可能会被忽略了。在....
    发表于 08-05 08:54 84次 阅读

    普源示波器实际的使用效果怎么样

    在很多研发型的企业或者是一些院校里面,经常会用到各种各样的显示设备,比如说像示波显示设备就用的比较的....
    的头像 agitek456 发表于 08-04 16:05 126次 阅读
    普源示波器实际的使用效果怎么样

    晶振电路设计是否合理

    皮尔斯振荡器中,连接晶振的芯片内部是一个线性的运算放大器,由于运算放大器的电压增益非常大,范围从数百....
    的头像 冬至配饺子 发表于 08-04 15:05 480次 阅读
    晶振电路设计是否合理

    示波器眼图如何分辨信号质量

    示波器是很多电子工程师常用的测试仪器,而且高科技的发展,也让示波器开始“进化”,很多高端示波器都会有....
    的头像 博宇讯铭 发表于 08-04 14:01 629次 阅读
    示波器眼图如何分辨信号质量

    AX630A开发板数据手册

    AX630A 是一款高算力,高能效比的 SoC 芯片。芯片集成了四核 A53 CPU, 28.8TO....
    发表于 08-03 11:26 17次 阅读

    使用ZCU102开发板运行xdpdma例程

    本文来自AMD Xilinx实习生Shaoyi Chen及其同学Leslie Xu, 本教程将使用Z....
    的头像 XILINX开发者社区 发表于 08-03 10:27 67次 阅读

    示波器是什么 常用示波器类型介绍

    模拟示波器: 这是第一种流行的示波器。多年来,它以阴极射线管为基础,一直是使用示波器进行测试的中流砥....
    发表于 08-02 15:41 122次 阅读

    STM32G031J6开发板

    电子发烧友网站提供《STM32G031J6开发板.zip》资料免费下载
    发表于 08-02 15:22 21次 阅读
    STM32G031J6开发板

    函数部分定义的形式输入

    调用之后,函数的结果可用作为返回值或作为输出和输入/输出参数(实际参数)。
    的头像 机器人及PLC自动化应用 发表于 08-02 14:40 157次 阅读

    Microchip PIC18F4580开发板

    电子发烧友网站提供《Microchip PIC18F4580开发板.zip》资料免费下载
    发表于 08-02 14:29 13次 阅读
    Microchip PIC18F4580开发板

    ESP32电源开源分享

    电子发烧友网站提供《ESP32电源开源分享.zip》资料免费下载
    发表于 08-02 14:25 21次 阅读
    ESP32电源开源分享

    电流探头如何设置示波器参数

    知用电流探头能与市面上所有品牌的示波器兼容使用,为了准确方便地对电流进行测量,需要对示波器的参数进行....
    的头像 PRBTEK 发表于 08-02 14:01 438次 阅读
    电流探头如何设置示波器参数

    如何在不同场景下选择合适的示波器探头

    探头按照是否需要供电可分为有源探头(内置放大器,需要外部供电)和无源探头(内部都是无源器件,无需供电....
    的头像 PRBTEK 发表于 08-02 13:59 395次 阅读
    如何在不同场景下选择合适的示波器探头

    ARMando STM32F030R8T6开发板开源项目

    电子发烧友网站提供《ARMando STM32F030R8T6开发板开源项目.zip》资料免费下载
    发表于 08-02 11:30 22次 阅读
    ARMando STM32F030R8T6开发板开源项目

    如何选择用于机器学习的处理器

    这款开发板更大程度上提供的是一种开放平台,适用于原型开发以及使用大量 I/O 和外设的系统。它包括一....
    发表于 08-02 10:48 78次 阅读
    如何选择用于机器学习的处理器

    三种扫频方式:离散扫频 、插值扫频、快速扫频

    使用二分法来计算整个频段内的S参数和场解。软件自适应选择计算场解的频率点,并计算相邻两个频点之间的解....
    的头像 凡亿PCB 发表于 08-02 10:40 162次 阅读

    示波器六大采集模式介绍

    示波器信号采集方式是用于控制如何从采样点中产生出波形电,鼎阳示波器常用的波形捕获模式有普通模式和峰值....
    的头像 博宇讯铭 发表于 08-02 09:56 90次 阅读
    示波器六大采集模式介绍

    如何在Vitis加速设计中为Kernel创建面积约束

    Alveo系列开发板上的平台其实是一个DFX设计的静态部分,在Vitis 统一软件平台中使用Alve....
    的头像 邓长生 发表于 08-02 09:38 55次 阅读
    如何在Vitis加速设计中为Kernel创建面积约束

    基于ESP32的开发板带有板载电机驱动器

    电子发烧友网站提供《基于ESP32的开发板带有板载电机驱动器.zip》资料免费下载
    发表于 08-02 09:19 23次 阅读
    基于ESP32的开发板带有板载电机驱动器

    基于示波器测试电源和信号完整性的挑战

    使用基于示波器的解决方案来测试电源和信号完整性存在一些测试挑战,必须考虑并解决这些测试挑战才能获得最....
    发表于 08-01 11:51 36次 阅读

    MLX90640 红外热成像仪测温传感器模块开发笔记(十)

    从第一篇开发笔记到今天最后MLX90640 红外热成像仪测温传感器模块开发笔记(十) 成果展示-红眼....
    的头像 工程监测 发表于 08-01 09:13 59次 阅读
    MLX90640 红外热成像仪测温传感器模块开发笔记(十)

    黑金AX102开发板教程

    黑金开发板教程
    发表于 07-31 09:05 32次 阅读

    示波器概述及使用方法

    一、示波器概述:是一种非常重要的电子测量仪器设备,一般由示波器本体和示波器探头组成。
    发表于 07-30 17:41 884次 阅读
    示波器概述及使用方法

    EV_ICS-51360-FX TDK InvenSense ICS多模MEMS麦克风

    venSense ICS多模MEMS麦克风具有230µA至590µA电流范围、-98dB FS高电源抑制,采用3.5mm × 2.65mm × 0.98mm表面贴装封装。ICS-51360模块具有50Hz至>20kHz的扩展频率响应和数字脉冲密度调制 (PDM) 输出。该MEMS麦克风兼容无锡/铅和无铅焊接工艺。TDK InvenSense ICS多模MEMS麦克风非常适合用于智能手机、麦克风阵列、平板电脑和相机应用。 特性 四阶Σ-Δ调制器 数字脉冲密度调制 (PDM) 输出 兼容无锡/铅和无铅焊接工艺 符合RoHS指令/WEEE标准 规范 −36dB FS ±1...
    发表于 11-11 09:07 405次 阅读

    SDE1B016GTKDWBA0ESA0 TDK Solid State Drives

    态驱动器满足工业应用中对SSD的要求,速度可达180MB/s。 这些设备使用最新的MLC型NAND闪存,具有读取重试功能,对于提高数据可靠性是必不可少的。 SSD具有自动恢复、数据随机化和自动刷新功能。
    发表于 10-23 19:06 287次 阅读

    P-NUCLEO-WB55 STMicroelectronicsPNUCLEOWB55STM32WBNucleo68数据包

    oelectronics P-NUCLEO-WB55 STM32WB Nucleo-68数据包是一套经济划算的方案,能够基于STM32WB双核多协议 超低功耗2.4GHz MCU 片上系统 (SoC) 快速开发WLAN和蓝牙应用。  STM32 Nucleo包含NUCLEO-68板(预装STM32WB55RG MCU)和USB加密狗(采用 STM32WB55CG MCU)。 NUCLEO-68板和USB加密狗配置为2.4GHz射频收发器蓝牙规格v5.0和IEEE 802.15.4-2011 PHY和MAC。NUCLEO-68板还包含Arduino Uno V3和 史多福连接器,可轻松集成到应用原型中。集成式ST-LINK/V2-1调试器/编程器,无需使用单独的探针。...
    发表于 10-23 16:06 399次 阅读

    STM32MP157A-DK1 STMicroelectronicsSTM32MP157ADK1探索套件

    oelectronics STM32MP157A-DK1探索套件支持利用STM32 MPU OpenSTLinux分布软件轻松开发应用程序。OpenSTLinux软件用于主处理器和协同处理器的STM32CubeMP1软件。该套件包含ST-LINK嵌入式调试工具、LED、按钮和一个以太网1Gbps连接器。它还包含一个USB Type-C™ OTG连接器、四个USB Type-A主机连接器和一个HDMI®收发器。它还包含一个立体声耳机插孔(带模拟麦克风)和一个microSD™连接器。为了扩展STM32MP157A-DK1探索套件的功能,提供两个GPIO扩展连接器,用于Arduino™和Raspberry Pi®屏蔽。 特性 基于STM32MP157 Arm®的双Cortex®-A7 32位 + Cortex®-M4 32位MPU,采用TFBGA361封装 圣普米克stpmic1a 4GbitDDR3L,16位,533MHz 1GB以太网 (RGMII),符合IEEE-802.3ab USBOTGHS 音频编#...
    发表于 10-23 15:06 1195次 阅读

    NUCLEO-H743ZI2 STMicroelectronics搭载STM32H743ZIMCU的STM32Nucleo144开发板

    oelectronics搭载STM32H743ZI MCU的STM32 Nucleo-144开发板用于测试STM32H743ZI微控制器的各种性能以及与之相对应的功耗情况。开关模式电源 (SMPS) 可显著降低运行模式下的功耗。该开发板设有用于实现Arduino® Uno V3连接功能的ST Zio连接器,以及用于通过各种扩展板扩展Nucleo开放式开发平台的 ST吗啡排针。STM32 Nucleo-144开发板无需单独的探头,因其已集成ST-LINK/V2-1调试器/编程器。STM32 Nucleo-144开发板随附STM32Cube MCU软件包中提供的STM32全面免费软件库和示例。 特性 采用LQFP144封装的STM32微控制器 外部SMPS,生成Vcore逻辑电源(仅可用于“-P”结尾的板) 符合IEEE-802.3-2002的以太网(取决于STM32支持) USB OTG或全速设备(取决于STM32支持) 3个用户LED 两个按钮(用户和复位) 32.768 kHz晶体振荡器 板连接器: 微型USB接口 SWD 以太网RJ...
    发表于 10-21 10:09 518次 阅读