搜索
bottom↓
回复: 49

【STM8手持示波仪】发几张实验图片,200KADC采样率,软件触发

[复制链接]
(404693875)

出0入0汤圆

发表于 2009-3-31 21:11:20 | 显示全部楼层 |阅读模式
没有数码相机,用手机拍的,拍照水平非常差,对付着能看清楚就行了。
信号源输出信号直接调了直流偏移。现在画图还是用的LCD的坐标系统,也就是左上角是0,0点,所以液晶最上面的线是GND


(原文件名:IMG0026A.jpg)


(原文件名:IMG0027A.jpg)


(原文件名:IMG0028A.jpg)


(原文件名:IMG0029A.jpg)


(原文件名:IMG0030A.jpg)


(原文件名:IMG0031A.jpg)


(原文件名:IMG0032A.jpg)


(原文件名:IMG0033A.jpg)


(原文件名:IMG0034A.jpg)


(原文件名:IMG0035A.jpg)

LCD显示刷新得有跳动、闪烁,还要改进。软件触发也不太准确(没办法现在没有硬件触发电路)。
(404693200)

出0入0汤圆

发表于 2009-3-31 21:22:35 | 显示全部楼层
O(∩_∩)O哈哈~
工作真效率!
(404693182)

出0入0汤圆

发表于 2009-3-31 21:22:53 | 显示全部楼层
哎,可以啊,基本出来了.如果LCD是蓝屏的,就漂亮了.

不知道你软件触发,哪里不准确了?
(404693120)

出0入0汤圆

发表于 2009-3-31 21:23:55 | 显示全部楼层
【楼主位】 ifree64
看来我们要实现硬件触发电路了!
(404693057)

出0入0汤圆

 楼主| 发表于 2009-3-31 21:24:58 | 显示全部楼层
相关代码


#include "stm8s.h"
#include "stm8s207r.h"
#include "lcd_19264.h"
#include "key.h"


void LCD_Clear(void);
void TIM1_Init(void);
void ADC_Init(void);
void LCD_DrawInterface(void);

#define ADC_BUFFER_SIZE 128
#define FMASTER (16000000UL)
#define TIM1_200K_ARR   (FMASTER/200000UL - 1)

volatile u8 flag_2ms_ok, flag_10ms_ok;
volatile u8 flag_adcbuf_full;
volatile u8 TriggerVoltage = 128;
u8 ADC_Buffer[ADC_BUFFER_SIZE];
volatile u8 ADC_Index;

void main(void)
{
    u8 j = 0, i;  
    u8 keycode;
    int timer5s_counter = 0;
   
    CLK_Init();
    TIM4_DeInit();
   
    /* Time base configuration */
    TIM4_TimeBaseInit(TIM4_PRESCALER_128, 250);
    TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);
   
    GPIO_Init( GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);
   
    LCD_Init();
    TIM1_Init();
    ADC_Init();
    enableInterrupts();

    TIM4_Cmd(ENABLE);
    /* Infinite loop */
    while (1)
    {
        if(flag_10ms_ok)
        {
            flag_10ms_ok = 0;
            keycode = KEY_Scan();
            // Parse keycode
        }
        if( flag_adcbuf_full == 1)
        {
            LCD_DrawInterface();
            for( i = 0 ; i < 128; i++ )
                LCD_BufferDrawLine(i, ADC_Buffer>>2, i+1, ADC_Buffer[i+1]>>2, LCD_SET);
            flag_adcbuf_full = 0;   
            LCD_BufferToLCD();            
        }

    }
  
}


void CLK_Init(void)
{
    /* Configure HSI prescaler*/
    CLK_CKDIVR &= ~0x10;          /* 01: fHSI= fHSI RC output/2. */

    /* Configure CPU clock prescaler */
   // CLK_CKDIVR |= 0x01;           /* 001: fCPU=fMASTER/2. */
    CLK_CKDIVR = 0;
}

void TIM1_Init(void)
{
    TIM1_DeInit();
        /* Time base configuration */
    /*
            TIM1_Period = TIM1_200K_ARR
        TIM1_Prescaler = 0
            TIM1_RepetitionCounter=0
    */
      
    TIM1_TimeBaseInit(0, TIM1_COUNTERMODE_UP, TIM1_200K_ARR, 0);
       
    /* Configure the TIM1 Master/Slave mode */
    TIM1_SelectMasterSlaveMode(ENABLE);
    /* Trigger the conversion */
    TIM1_SelectOutputTrigger(TIM1_TRGOSOURCE_UPDATE);
    TIM1_Cmd(ENABLE);
}

void ADC_Init(void)
{
     /*  Init GPIO for ADC2 */
    GPIO_Init(GPIOE, GPIO_PIN_6, GPIO_MODE_IN_FL_NO_IT);

    ADC2_DeInit();

    ADC2_Init( ADC2_CONVERSIONMODE_SINGLE,
               ADC2_CHANNEL_9,
               ADC2_PRESSEL_FCPU_D6,
               ADC2_EXTTRIG_TIM,
               ENABLE,
               ADC2_ALIGN_LEFT,
               ADC2_SCHMITTTRIG_CHANNEL9,
               DISABLE             /* SchmittTrigger Disable */
              );

    /* Enable the ADC2 peripheral */
    ADC2_Cmd(ENABLE);

    /* Enable EOC interrupt */
    ADC2_ITConfig(ENABLE);
   
    /*Configure the ADC2 external trigger */
    ADC2_ExternalTriggerConfig(ADC2_EXTTRIG_TIM, ENABLE);
   
}

void LCD_DrawInterface(void)
{
    u8 i;
    LCD_Clear();
    for(i = 0; i < 64; i+=16)
        LCD_BufferDrawXDotLine(0, i, 128, LCD_SET);
    for(i = 0; i <129; i+=16)
        LCD_BufferDrawYDotLine(i, 0, 63, LCD_SET);
        
    LCD_PutString5x8(22, 0, "STM8 DSO");
    LCD_PutString5x8(22, 1, "2000Hz");

}


ADC采样中断
extern u8 flag_adcbuf_full;
extern u8 ADC_Buffer[];
extern u8 ADC_Index;
extern u8 TriggerVoltage;
#define ADC_BUFFER_SIZE 128
@far @interrupt void ADC2_IRQHandler (void)
{
    static u8 begin_soft_trigger = 1;
    static u8 PreValue = 0;
    u8 Conversion_Value = ADC2->DRH;    // 只读取高8位结果
    if( begin_soft_trigger )
    {
        if( PreValue <= TriggerVoltage && Conversion_Value > TriggerVoltage )
        {
            // 满足幅度为TriggerVolatage,且为上升沿
            begin_soft_trigger = 0;
        }
        else
            PreValue = Conversion_Value;
    }
    if( !flag_adcbuf_full )
    {
        ADC_Buffer[ADC_Index++] = Conversion_Value;
        if(ADC_Index >= ADC_BUFFER_SIZE)
        {
            flag_adcbuf_full = TRUE;
            ADC_Index = 0;
            begin_soft_trigger = 1;
        }
    }
    ADC2_ClearITPendingBit();
}
(404692993)

出0入0汤圆

 楼主| 发表于 2009-3-31 21:26:02 | 显示全部楼层
软件触发效果上波形有点左右晃动
(404692635)

出0入0汤圆

发表于 2009-3-31 21:32:00 | 显示全部楼层
效率相当高!

触发问题看来单纯软件来解决是不行了,还是硬件靠得住。
(404692408)

出0入0汤圆

发表于 2009-3-31 21:35:47 | 显示全部楼层
【6楼】 my_avr  
效率相当高!

触发问题看来单纯软件来解决是不行了,还是硬件靠得住。
-----------------
是啊,看来我们得采用硬件触发电路,就采用那位来自台湾朋友的建议,使用LM311,比较电平采用PWM产生,再加滤波使用产生偏移电压那个方法,如何?
(404692217)

出0入0汤圆

发表于 2009-3-31 21:38:58 | 显示全部楼层
如果作图的时候,取ADC结果的高6位呢?会不会好些呢?
(404692035)

出0入0汤圆

 楼主| 发表于 2009-3-31 21:42:00 | 显示全部楼层
现在就是用的高6位。我再试试。
(404691785)

出0入0汤圆

 楼主| 发表于 2009-3-31 21:46:10 | 显示全部楼层
【7楼】 smallsnail 燕 青
【6楼】 my_avr  
效率相当高!

触发问题看来单纯软件来解决是不行了,还是硬件靠得住。
-----------------
是啊,看来我们得采用硬件触发电路,就采用那位来自台湾朋友的建议,使用LM311,比较电平采用PWM产生,再加滤波使用产生偏移电压那个方法,如何?

---------------

但魏坤就是用的软件触发,我的软件触发参考的他的代码,怎么他的就可以稳定工作呢?
(404691387)

出0入0汤圆

发表于 2009-3-31 21:52:48 | 显示全部楼层
软件的基本功能实现。
我做硬件的要捉紧时间才行。。
顺便问。各位收Cosmic C 许可文件 顺利吗?
(404691352)

出0入0汤圆

发表于 2009-3-31 21:53:23 | 显示全部楼层
你的数据缓存是多少?
(404691045)

出0入0汤圆

发表于 2009-3-31 21:58:30 | 显示全部楼层
你这句:ADC_Buffer[ADC_Index++] = Conversion_Value;
如果改成:ADC_Buffer[ADC_Index++] = Conversion_Value>>2;试过吗?

或者:    u8 Conversion_Value = ADC2->DRH;    // 只读取高8位结果
改成:    u8 Conversion_Value = (ADC2->DRH)>>2;    // 只读取高6位结果
(404690902)

出0入0汤圆

 楼主| 发表于 2009-3-31 22:00:53 | 显示全部楼层
【11楼】 ZealotNH 发仔

小声的告诉你,我用的是STM32/STM8板块里一个朋友发的DB
(404690807)

出0入0汤圆

 楼主| 发表于 2009-3-31 22:02:28 | 显示全部楼层
if( flag_adcbuf_full == 1)
        {
            LCD_DrawInterface();
            for( i = 0 ; i < 128; i++ )
                LCD_BufferDrawLine(i, ADC_Buffer>>2, i+1, ADC_Buffer[i+1]>>2, LCD_SET);
            flag_adcbuf_full = 0;   
            LCD_BufferToLCD();            
        }

我这样用效果应该是一样的吧?
(404690760)

出0入0汤圆

 楼主| 发表于 2009-3-31 22:03:15 | 显示全部楼层
【12楼】 smallsnail 燕 青

现在数据缓存只开了128点
(404690753)

出0入0汤圆

发表于 2009-3-31 22:03:22 | 显示全部楼层
【11楼】 ZealotNH 发仔
顺便问。各位收Cosmic C 许可文件 顺利吗?
----------------------
你的许可不行吗?
我的当天就回复了!
(404690675)

出0入0汤圆

发表于 2009-3-31 22:04:40 | 显示全部楼层
不知是不是我写的不好,还是我用的139邮箱有问题。
(404690634)

出0入0汤圆

发表于 2009-3-31 22:05:21 | 显示全部楼层
现在又用 南海服务器的邮箱再发了一次。
(404690587)

出0入0汤圆

发表于 2009-3-31 22:06:08 | 显示全部楼层
【16楼】 ifree64  
12楼】 smallsnail 燕 青

现在数据缓存只开了128点
--------------------------------
128个点少了点,下面是魏坤的描述:

(原文件名:2.jpg)
(404690459)

出0入0汤圆

发表于 2009-3-31 22:08:16 | 显示全部楼层
【19楼】 ZealotNH 发仔
-------------
悄悄的说一声,我是用某知名公司名字、电话、传真,我自己的GMAIL邮箱发送的,O(∩_∩)O哈哈~
(404690191)

出0入0汤圆

 楼主| 发表于 2009-3-31 22:12:44 | 显示全部楼层
哦,他有一个FIFO,这个有4K的容量,而且采样数据读取都由FIFO读取了。所以在我的代码中处理方式有点不一样,我是用
if( begin_soft_trigger )
    {
        if( (PreValue <= TriggerVoltage) && (Conversion_Value >= TriggerVoltage) )
        {
            // 满足幅度为TriggerVolatage,且为上升沿
            begin_soft_trigger = 0;
        }
    }
来判断触发的,触发后再保存的采样数据。
(404686606)

出0入0汤圆

 楼主| 发表于 2009-3-31 23:12:29 | 显示全部楼层
加了触发电平按键调节后,发现调节触发电平,在某些频率上波形可以稳定显示。
(404684518)

出0入0汤圆

发表于 2009-3-31 23:47:17 | 显示全部楼层
【23楼】 ifree64 根据实际情况评估一下,看看是否有必要使用硬件触发??
(404645727)

出0入0汤圆

发表于 2009-4-1 10:33:48 | 显示全部楼层
我装了好2天了,一直没收到Cosmic C 许可文件,不知道怎么回事?当我打开软件的时候,还要我的计算机名,怎么回事?
(404645284)

出0入0汤圆

发表于 2009-4-1 10:41:11 | 显示全部楼层
smallsnail 燕 青,你能发一个许可文件给我吗?我会断网运行的
(404644230)

出0入0汤圆

发表于 2009-4-1 10:58:45 | 显示全部楼层
我也没收到许可文件。
许可是和硬件的一些编号关联的。别人发给你也没用。
(404643461)

出0入0汤圆

 楼主| 发表于 2009-4-1 11:11:34 | 显示全部楼层
看看这个帖子,直接解压即可。
http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=3229327&bbs_page_no=1&search_mode=1&search_text=stm8&bbs_id=3020
(404643148)

出0入0汤圆

发表于 2009-4-1 11:16:47 | 显示全部楼层
现在还没收到许可。看来我RP不好。
(404643143)

出0入0汤圆

发表于 2009-4-1 11:16:52 | 显示全部楼层
楼主的代码还没来得及细看,2M波形用的是等效采样么?
STM8最高采样率500K不到
(404642348)

出0入0汤圆

发表于 2009-4-1 11:30:07 | 显示全部楼层
对这个问题“加了触发电平按键调节后,发现调节触发电平,在某些频率上波形可以稳定显示。 ”
只是猜想。
因为采样频率固定,如果信号频率合适的时候,采样点刚好每次都落在相同的地方,特例是刚好落在触发电平位,这样就可以显示稳定。
但这种情况是特殊频率才会发生,这个可以根据采样频率计数出来。

但是输入频率不再特殊频率时,就会发生偏移。
就是这次采样刚好落在触发电平位置,但下次采样,就未必有采样点刚好能落在触发电平位,偏了一点,于是就显示不稳定了。

可能表达不清,也只能说到这个水平了。这个问题好似有专业术语的叫法。

这个应该可以在显示时通过软件方法调整吧?
(404641237)

出0入0汤圆

发表于 2009-4-1 11:48:38 | 显示全部楼层
呃,2K看成2M了……
(404640581)

出0入0汤圆

发表于 2009-4-1 11:59:34 | 显示全部楼层
还是建议用比较器触发。
要用软件的话,不如开个大的缓存。要触发的时候到数据中间去挑。
总有一款适合你。
(404638327)

出0入0汤圆

 楼主| 发表于 2009-4-1 12:37:08 | 显示全部楼层
关于触发的问题应该如【31楼】 ZealotNH 发仔 所分析的原因,但也不完全是。

软件触发 现在是应该是起到一定效果的,因为在低频时,每隔大约20Hz的频率都能稳定显示,频率高于10K后,就不稳定了,我分析可能是就算都是在触发电平处开始采样,但每次采样不会准确的在同一个点,这样就会有点左右晃动,如果这个问题不解决就算用硬件触发,还是可能会出现每次采样不准确在每一个周期的同一个时刻点而有左右晃动的现象。
(404637355)

出0入0汤圆

发表于 2009-4-1 12:53:20 | 显示全部楼层
【26楼】 myworkmail
许可是与计算机硬件相关的,一台计算机只有一个。
你把生成的文件发到我邮箱里,我给你申请一个试试!
我的邮箱是small_snail#163.com,把#换成@。
(404632833)

出0入0汤圆

 楼主| 发表于 2009-4-1 14:08:42 | 显示全部楼层
换了一个外部16MHz晶振,原来用的内部16M RC,修改了软件触发代码,现在改为1280点采样,100K采样率,可以对10K以下的信号稳定触发了。
触发放在了主循环里做了

        if( flag_adcbuf_full == 1)
        {
            LCD_DrawInterface();
            i = 0;
            while( !( ADC_Buffer <= TriggerVoltage && ADC_Buffer[i+1] >= TriggerVoltage) )
            {
                i++;
                if(i > ADC_BUFFER_SIZE - 128 )
                {
                    goto next;
                }
            }
            for( j = 0 ; j < 128 ; j++, i++ )
                LCD_BufferDrawLine(j, ADC_Buffer, j+1, ADC_Buffer[i+1], LCD_SET);
            next:
                flag_adcbuf_full = 0;   
      
        }
(404629785)

出0入21汤圆

发表于 2009-4-1 14:59:30 | 显示全部楼层
不要求单次的话,软件触发还是很好的……经济实惠,呵呵~~
(404623942)

出0入0汤圆

发表于 2009-4-1 16:36:53 | 显示全部楼层
简单的单次触发,软件也是可以实现的.
(404019865)

出0入0汤圆

发表于 2009-4-8 16:24:50 | 显示全部楼层
是的,用软件触发的话,丢帧严重,如果去捕获串口的数据的话,几乎没什么用.用比较器加锁存,直接控制FIFO使能,实时性应该不错的
(402221130)

出0入0汤圆

发表于 2009-4-29 12:03:45 | 显示全部楼层
mark
(401953678)

出0入0汤圆

发表于 2009-5-2 14:21:17 | 显示全部楼层
最近打算用STC新推出的单片机来做下数据采集,据官方资料可以做到每秒30M,不知道是不是真的,如果是的话那么是不是采样速度就可以上去了,这个单片机好像也是1T的。
(386980600)

出0入0汤圆

发表于 2009-10-22 21:32:35 | 显示全部楼层
支持
(297384669)

出0入0汤圆

发表于 2012-8-24 21:18:06 | 显示全部楼层
ywl0409 发表于 2009-3-31 21:22
哎,可以啊,基本出来了.如果LCD是蓝屏的,就漂亮了.

不知道你软件触发,哪里不准确了? ...

蓝屏响应速度慢,白绿屏快多了!
(292571373)

出0入0汤圆

发表于 2012-10-19 14:19:42 | 显示全部楼层
cool                                                                     
(291904976)

出0入0汤圆

发表于 2012-10-27 07:26:19 | 显示全部楼层
来个整体图片啊
(228610630)

出0入0汤圆

发表于 2014-10-29 21:12:05 | 显示全部楼层
不错的样子,点赞
(228359642)

出0入0汤圆

发表于 2014-11-1 18:55:13 | 显示全部楼层
不错  以后学习用得到
(228358715)

出0入0汤圆

发表于 2014-11-1 19:10:40 | 显示全部楼层
mark,备用
(227594056)

出0入0汤圆

发表于 2014-11-10 15:34:59 来自手机 | 显示全部楼层
太牛了啊!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号 )

GMT+8, 2022-1-26 20:09

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表