历史上的今天
返回首页

历史上的今天

今天是:2025年07月08日(星期二)

正在发生

2021年07月08日 | 示波器设计—自动触发和普通触发

2021-07-08 来源:eefocus

自带触发和普通触发是示波器设计中比较重要的两个功能,本章节为大家讲解二代示波器中自动触发和普通触发的实现。


9.1    自动触发


9.2    普通触发


9.3     总结


9.1  自动触发

由于示波器模拟前端模块稍有些问题,所以自动触发功能是用软件实现的。软件实现自动触发比较容易实现,具体的实现代码如下:


/*  通过软件检测实现上升沿触发,并保留最后600的数据不做检测,用于直接显示 2048-600 = 1448; */


j = 0;


for(i = 0; i < 1448; i++)


{


     j++;


     if((g_DSO1->usWaveBufTemp[i] > g_TrigVol->usTrigValue) &&


        (g_DSO1->usWaveBufTemp[i+1] < g_TrigVol->usTrigValue))


     {   


         break;


     }


}


g_DSO1->usWaveBufTemp是2048个ADC数据的缓冲区,g_TrigVol->usTrigValue是上升沿触发值。for循环的作用就是从1448个数据中找到满足触发值的位置,判断方法也比较简单,大于前一个值小于后一个值即可。


保留600个数据是因为这个大小是波形显示区一次可以显示的波形个数。如果从前2048-600 = 1448个数据中检索不到满足要求的数据将不再检索,直接显示末尾的600个数据,如果检测到将直接从for循环里面退出。


这个方法在实际测试中比较好用,另外上升沿阀值的判断还不够严谨,大家有兴趣可以继续完善下。


9.2   普通触发

普通触发的实现是基于ADC的模拟看门狗功能,通过设置不同看门狗阀值实现不同的触发电压。由于使能了看门狗中断,检测到外部触发电压后会进入ADC模拟看门狗中断。在中断里面判断是否是上升沿触发,如果是的话,会关闭模拟看门狗中断并开启一个定时器计数功能,目的是为了采集这个触发电压前后各1024个ADC数据,基本的实现思路就是这个样子的。


下面把实际的实现为大家做个说明:


第1步:将ADC3配置使能模拟看门狗功能。



/*ADC3的配置*****************************************************************/


ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;


ADC_InitStructure.ADC_ScanConvMode = DISABLE;


ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;


ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;


ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC3;


ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;


ADC_InitStructure.ADC_NbrOfConversion = 1;


 


/* ADC3 规则通道配置 */


ADC_Init(ADC3, &ADC_InitStructure);


ADC_RegularChannelConfig(ADC3, ADC_Channel_10, 1, ADC_SampleTime_3Cycles);


 


/* 使能 ADC3 DMA */


ADC_DMACmd(ADC3, ENABLE);


 


/* 配置模拟看门狗的阀值 注意别配置反了,要不一直进入中断 */


ADC_AnalogWatchdogThresholdsConfig(ADC3, 4095, 0);


 


/* 配置模拟看门狗监测ADC3的通道10 */


ADC_AnalogWatchdogSingleChannelConfig(ADC3, ADC_Channel_10);


 


/* 使能一个规则通道的看门狗 */


ADC_AnalogWatchdogCmd(ADC3, ADC_AnalogWatchdog_SingleRegEnable);


 


/* 使能模拟看门狗中断 */


ADC_ITConfig(ADC3, ADC_IT_AWD, ENABLE);


 


/* 使能DMA请求 -------------------------------------------------------------*/


ADC_DMARequestAfterLastTransferCmd(ADC3, ENABLE);


 


/* Enable ADC3 --------------------------------------------------------------*/


ADC_Cmd(ADC3, ENABLE);


特别注意函数ADC_AnalogWatchdogThresholdsConfig的设置,因为是12位分辨率的ADC,最大值就是2^12 – 1 = 4095,这里设置为4095表示超过4095才会触发模拟看门狗中断,由于已经是最大值了,所以不会触发模拟看门狗中断。



第2步:模拟看门狗中断。


达到设置的模拟看门狗触发值会进入到这个中断里面。



/*


*********************************************************************************************************


*    函 数 名: ADC_IRQHandler


*    功能说明: 模拟看门狗中断服务程序。


*    形    参: 无


*    返 回 值: 无


*********************************************************************************************************


*/


void ADC_IRQHandler()


{


     /* 读取DMA剩余要传输的数目 */


     g_usTrigCount = DMA2_Stream1->NDTR;


 


     /* 确认是否是ADC3的看门狗中断 */


     if((ADC3->SR)&0x01)                                                                                                   


    {


         /* 取触发值的前一个点,查看是否是在阀值范围内,从而判断是上升沿还是下降沿 */


         if(g_usTrigCount == 10240)


         {


              /* 剩余10240表示触发值是ADC3ConvertedValue[10239]是触发值,那么上一个点就是10238 */


              g_usTrigTempFlag = ADC3ConvertedValue[10238];


         }


         else if(g_usTrigCount == 10239)


         {


              /* 剩余10239表示触发值是ADC3ConvertedValue[0]是触发值,那么上一个点就是10239 */


              g_usTrigTempFlag = ADC3ConvertedValue[10239];


         }


         else


         {


              /* 剩余10239表示触发值是ADC3ConvertedValue[0]是触发值,那么上一个点就是10239 */


              g_usTrigTempFlag = ADC3ConvertedValue[10238 - g_usTrigCount];


         }


        


         /* 判断是否是上升沿,是的话开启定时器记录ADC数据 */


         if(g_usTrigTempFlag <= g_TrigVol->usTrigValue)


         {


              /* 关闭ADC3的看门狗中断 */


              ADC3->CR1 &= 0xffffffbf;


              TriggerFlag = 1;


             


              /* 启动定时器计数 */


              TIM8->CR1 |= 0x01;


         }


        /* 清除挂起标志 */


         ADC3->SR &= 0xfe;


    }


}


进入到这个中断后,主要做了一件事,判断是否是上升沿,如果是上升沿的话,将关闭模拟看门狗并开启定时器测量功能。也就是下面第3步要讲解的。



第3步:初始化一个定时器做时间测量,表示检测到触发值后记录一段时间的波形。


/*


*********************************************************************************************************


*    函 数 名: TIM8_MeasureTrigConfig


*    功能说明: 使用TIM8为普通触发模式下数据采集计时,定时采集触发值前后的1024个ADC数据


*    形    参:无


*    返 回 值: 无              


*********************************************************************************************************


*/


/*


     每次捕获采集触发值前后的1024个ADC数据(单通道)。


*/


const uint32_t g_TrigFreqTable[][2] =


{


     {60,   1024},    //2.8Msps  168000000/2800000 = 60  => 60 * 1024


     {84,   1024},    //2Msps    168000000/2000000 = 84  => 84 * 1024


     {168,  1024},    //1Msps    168000000/1000000 = 168 => 168 * 1024


     {336,  1024},    //500Ksps  168000000/500000  = 336 => 336 * 1024


     {840,  1024},    //200Ksps  168000000/200000  = 840 => 840 * 1024


    


     {1680,  1024},   //100Ksps 168000000/100000  = 1680  => 1680 * 1024


     {3360,  1024},   //50Ksps  168000000/50000   = 3360  => 3360 * 1024


     {8400,  1024},   //20Ksps  168000000/20000   = 8400  => 8400 * 1024


     {16800, 1024},   //10Ksps  168000000/10000   = 16800 => 16800 * 1024


     {33600, 1024},   //5Ksps   168000000/5000    = 33600 => 33600 * 1024


 


     /* 下面5种采样频率下刷新较慢,因为采集前后1024个ADC的时间较长 */


     {42000,    2048},    //2Ksps 168000000/2000  = 84000 => 84000 * 1024


     {42000,    4096},    //1Ksps 168000000/1000  = 168000 => 168000 * 1024


     {42000,    8192},    //500sps 168000000/500  = 336000 => 336000 * 1024


     {42000,    20480},   //200sps 168000000/200  = 840000 => 840000 * 1024


     {42000,    40960},   //100sps 168000000/100  = 1680000 => 1680000 * 1024


    


     /* 下面这几种采样率不做触发支持 */


     {42000,    40960},   //50sps


     {42000,    40960},   //20sps


     {42000,    40960},   //10sps


     {42000,    40960},   //5sps


     {42000,    40960},   //2sps


     {42000,    40960},   //1sps     


};



void TIM8_MeasureTrigConfig(void)


{


     TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;


     NVIC_InitTypeDef NVIC_InitStructure;


    


     /* 开启时钟 */


     RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);


    


     /* 加上第一次进入中断的标志,进入中断后将其置1 */


     g_usFirstTimeIRQFlag = 0;


 


     /* 使能定时器8中断  */


     NVIC_InitStructure.NVIC_IRQChannel = TIM8_UP_TIM13_IRQn;


     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;


     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;


     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;


     NVIC_Init(&NVIC_InitStructure);


 


     /* 定时器配置 */


     TimeBaseId = 1;        /* 开机后按照ADC单通道1Msps进行配置 */


     TIM_DeInit(TIM8); 


     TIM_BaseInitStructure.TIM_Period = g_TrigFreqTable[TimeBaseId][0] - 1;


     TIM_BaseInitStructure.TIM_Prescaler = g_TrigFreqTable[TimeBaseId][1] - 1;


     TIM_BaseInitStructure.TIM_ClockDivision = 0;


     TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;


     TIM_TimeBaseInit(TIM8, &TIM_BaseInitStructure);


     TIM_ITConfig(TIM8, TIM_IT_Update, ENABLE);


     TIM_Cmd(TIM8, DISABLE);


}


 


/*


*********************************************************************************************************


*    函 数 名: Time8Recorder


*    功能说明: 使用TIM8为普通触发模式下数据采集计时,定时采集触发值前后的1024个ADC数据


*    形    参:无


*    返 回 值: 无              


*********************************************************************************************************

推荐阅读

史海拾趣

Bals Elektrotechnik GmbH & Co KG公司的发展小趣事

在1948年,Günter Bals在完成了建筑公司的学徒实习后,决定创立自己的运输公司。他凭借自己的勤奋和才智,很快建立起了一支由14辆卡车组成的运输队伍,并在德国本地开展货运代理业务。这一阶段的创业经历不仅锻炼了Bals的商业头脑,也为他日后在电子行业的发展积累了宝贵的资金和经验。

格科微电子(GALAXYCORE)公司的发展小趣事

1958年,Bals Elektrotechnik公司迎来了一个重大突破——连接器开始批量生产。随着技术的不断进步,公司逐渐将材料从铝转向塑料,这不仅降低了生产成本,还提高了产品的性能和可靠性。这一创新举措使得Bals在电气连接器市场上占据了重要地位,为后续的发展奠定了坚实基础。

B+B SmartWorx公司的发展小趣事

2016年,B+B SmartWorx与研华达成合并协议,成为研华全球大家庭的一员。这次合并是双方战略发展的重要一步,研华看中了B+B SmartWorx在物联网和工业网通领域的深厚积累,而B+B SmartWorx则借助研华在亚洲的资源与经验,进一步拓展其全球市场。合并后,双方在产品开发、业务布局等方面进行了深度融合,共同推动工业物联网领域的发展。

HEIMANN公司的发展小趣事

B+B SmartWorx始终坚持以客户为中心,通过提供优质的产品和服务来满足客户需求。公司相信,客户满意度和产品创新是驱动其增长的关键因素。因此,B+B SmartWorx在设计和制造网络连接设备时,始终注重设备的易用性、可管理性和可靠性。这种对客户的深度理解和持续创新,使得B+B SmartWorx在电子行业中赢得了良好的声誉,并实现了持续稳健的发展。

这些故事基于B+B SmartWorx的发展历程和现有信息,虚构了一些具体情节,旨在展现该公司在电子行业中的成长与变迁。请注意,这些故事可能并不完全准确反映B+B SmartWorx的实际发展情况,如需了解更多关于该公司的具体信息,建议查阅相关官方资料或新闻报道。

G-Two Inc公司的发展小趣事

背景:2003年,福斯特的创始人林建华,一位在纺织业和化工领域有着丰富经验的工程师,决定跨界进入光伏材料行业。当时,国内光伏组件封装所需的光伏胶膜几乎全部依赖进口,被国外几家大公司垄断。

发展:林建华凭借在热熔网膜领域的技术积累,带领团队成功研发出EVA胶膜,打破了国外技术垄断。这一技术突破不仅降低了国内光伏组件的生产成本,也为福斯特在光伏材料领域的崛起奠定了坚实基础。

成果:2008年,福斯特的EVA胶膜产品凭借优异的性能和价格优势,成功打入国内光伏组件企业的供应名录,并跻身全球EVA胶膜供应商前三强。

Eurohm Resistors公司的发展小趣事

在全球化的浪潮下,Eurohm Resistors公司积极拓展海外市场。公司深入分析了全球电子行业的发展趋势和市场需求,制定了详细的市场拓展计划。通过与当地合作伙伴的紧密合作,Eurohm Resistors成功打入了多个国家和地区的市场,实现了全球化布局。

问答坊 | AI 解惑

嵌入式linux操作系统资料汇总 1:入门资料

嵌入式linux操作系统资料汇总 1:入门资料 大家有什么好的资料可以上传噢! [ 本帖最后由 daicheng 于 2009-9-25 11:33 编辑 ]…

查看全部问答>

传感器教程

本帖最后由 paulhyde 于 2014-9-15 08:56 编辑 传感器教程 电路原理  …

查看全部问答>

运算放大器的基础与应用

新手发个帖赚点积分为了继续学习…

查看全部问答>

HP imagepoint彩超系统中文有声培训

[ 本帖最后由 fish001 于 2010-2-24 18:57 编辑 ]…

查看全部问答>

UC/OS 内核 OSTimeDly()函数求解。

/* ********************************************************************************************************* *                            ...…

查看全部问答>

VS2005的Platform Builder插件过期了,求解决方法!

很早之前安装了VS2005和Platform Builder用来开发winCE6.0,近期刚好有一项目需要用winCE6.0 来开发,今天准备建个winCE6.0的工程才发现软件过期了(180天试用版).超级郁闷! 在这里请教各位高手,在不重装PB插件和修改电脑系统时间的前提下有什么好的 ...…

查看全部问答>

为什么我加了 jtagWait()函数,程序就进入死循环出不来了?

//  防止JTAG失效 void jtagWait(void) {     SysCtlPeriEnable(KEY_PERIPH);                           //  使能 ...…

查看全部问答>

直接耦合共射放大电路的直流负载线方程(斜率)问题

思路一: 由左图,得 Uce=Vcc - Ic*Rc                                &n ...…

查看全部问答>

zigbee 2007协议资料-1

这是我最近学习ZIGBEE CC2530 购买的产品 包括很好的技术资料提供给大家学习!…

查看全部问答>