搜索
bottom↓
回复: 47

秀秀我的小示波仪, 用LPC2136片内ADC

[复制链接]

出0入0汤圆

发表于 2009-4-23 20:21:07 | 显示全部楼层 |阅读模式
手机30W像素拍的, 凑合着看, 还有些不完善的地方, 只是想了解工作原理, 买到高速ADC后再弄个实用点的。
支持 上升沿、下降沿同步, 也可以不用同步信号。


正弦波 (原文件名:090423_195401.jpg)


方波 (原文件名:090423_195440.jpg)


X轴收缩 (原文件名:090423_195506.jpg)


三角波 (原文件名:090423_195617.jpg)


跟电脑上软件显示的波形比较 (原文件名:090423_200142.jpg)

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2009-4-23 20:25:01 | 显示全部楼层
正弦波传错图片了, 晕。


正弦波 (原文件名:090423_195336.jpg)


正弦波 (原文件名:090423_195634.jpg)

出0入0汤圆

 楼主| 发表于 2009-4-23 20:34:28 | 显示全部楼层
主要源代码, 目前功能还不够完善


/**---------------------版权 / Copyright (c)----------------------------------------------***
***                     作者 / Author:  akin                                              ***
***                     邮件 / E-mail:  jenkinyan@163.com                                 ***
***                                                                                       ***
***---------------------------------------------------------------------------------------***
*** 创 建 人:          akin                                                              ***
*** 创建日期:                                                                            ***
*** 创建版本:                                                                            ***
*** 文件描述:                                                                            ***
***---------------------------------------------------------------------------------------***
*** 修 订 人:                                                                            ***
*** 修订日期:                                                                            ***
*** 修订版本:                                                                            ***
*** 修订描述:                                                                            ***
***---------------------------------------------------------------------------------------**/
#include        "config.h"
#include        <stdio.h>

/********************************************************/
/*                                                      */
/*      任务同步的握手信号 和 共享数据                  */
/*                                                      */
/********************************************************/


/********************************************************/
/*                                                      */
/*      任务配置:堆栈大小、优先级别                    */
/*                                                      */
/********************************************************/
#define        TASK_INIT_STKLEN                        512

#define        TASK_INIT_PRIO                                9

OS_STK        TaskInitStk                [TASK_INIT_STKLEN];

/********************************************************/
/*                                                      */
/*      主程序和起始(初始化)任务                      */
/*                                                      */
/********************************************************/
void        TaskInit(void *pdata);

int                main (void)
{
        OSInit();
        OSTaskCreate(TaskInit,        (void *)0,         &TaskInitStk[TASK_INIT_STKLEN - 1], TASK_INIT_PRIO);
        OSStart();
        return 0;                                                                                                                       
}


void        SysInit(void)
{
        TargetInit();                VBusInit();
        VBUS_RST_CLR();                OSTimeDly(OS_TICKS_PER_SEC / 10);
        VBUS_RST_SET();                OSTimeDly(OS_TICKS_PER_SEC / 20);
        LcdInit();
        #if OS_TASK_STAT_EN > 0
        OSStatInit();
        #endif
}




#define        OSC_MAX_SAMPLE_RATE        100000
#define        OSC_WINDOW_XMAX                90
static        volatile        uint8        Wave[OSC_WINDOW_XMAX];
static        volatile        uint8        Units = 0;
static        volatile        uint8        SampStart = 0;

static        volatile        uint8        TrigState = 0;
static        volatile        uint8        TrigValue = 32;
static        volatile        int8        TrigMethor = 0;
static        volatile        uint32        SampleRate = 1000;
static        volatile        uint8        Multiply  = 128;

void        AdcInit(uint32        sps)
{
        OS_ENTER_CRITICAL();
        PCONP |= (1 << 12);                                                        // 打开ADC的功率控制位
       
        PINSEL1 &= (~(3U << 28)) | (1 << 28);                // P0.30连接到AD0.3
        PINSEL1 = 1 << 28;                                                       

        /* 设置MAT1.0匹配翻转 */       

        T1MCR = 0x02;                                                                // 设置T1MR0匹配后将T1TC复位
        T1EMR = 3 << 4;                                                                // T1MR0匹配后MAT1.0输出翻转
        T1MR0 = Fpclk/(2 * sps);                                        // 输出频率周期控制, 定时0.25s钟MAT1.0翻转一次
        T1TCR = 0x03;                                                                // 启动并复位T1TC
        T1TCR = 0x01;

        /* 进行ADC模块设置 */
        ADCR = (1 << 3)                                                        |        // SEL=8,选择通道3
                        ((Fpclk / 4400000 - 1) << 8)        |        // CLKDIV=Fpclk/1000000-1,转换时钟为1MHz
                        (0 << 16)                                                |        // BURST=0,软件控制转换操作
                        (0 << 17)                                                |        // CLKS=0, 使用11clock转换
                        (1 << 21)                                                |          // PDN=1,正常工作模式
                        (0 << 22)                                                |          // TEST1:0=00,正常工作模式
                        (6 << 24)                                                |        // START=6,当EDGE选择的边沿出现在MAT1.0时启动AD转换
                        (1 << 27);                                                         // MAT1.0上升沿启动转换
        OS_EXIT_CRITICAL();
       
        LcdPrintf(OSC_WINDOW_XMAX + 1, 53, "%06d", SampleRate);
}

/*********************************************************************************************************
** 函数名称 :AdcIrqException
** 函数功能 :AD中断服务程序
** 入口参数 :无
** 出口参数 :无
**********************************************************************************************************/
void        AdcIrqException(void)
{
        static        uint8        lval = 0;
        uint8        val;
       
        //OS_ENTER_CRITICAL();
        val = (ADDR >> 10) & 0x3f;
       
        if(SampStart)       
        {
                if(TrigState)        // 已同步
                {
                        Wave[Units] = val;
                        Units++;
                        if(Units >= OSC_WINDOW_XMAX)
                        {
                                TrigState = 0;
                                SampStart = 0;
                        }
                }
                else                        // 未同步
                {
                        switch(TrigMethor)        // 同步方式选择
                        {
                                case        -1:                // 下降沿同步
                                        if(lval > TrigValue && val <= TrigValue)
                                        {
                                                TrigState = 1;
                                                Units = 0;
                                                Wave[Units] = val;
                                                TrigState = 1;
                                                Units++;
                                        }
                                        break;
                       
                                case        1:                // 上升沿同步
                                        if(lval < TrigValue && val >= TrigValue)
                                        {
                                                TrigState = 1;
                                                Units = 0;
                                                Wave[Units] = val;
                                                TrigState = 1;
                                                Units++;
                                        }
                                        break;
                               
                                case        0:                // 无同步
                                        TrigState = 1;
                                        Units = 0;
                                        Wave[Units] = val;
                                        TrigState = 1;
                                        Units++;
                               
                                        break;
                               
                                default:        break;
                        }
                }
        }
        else
        {
                Units = 0;
                TrigState = 0;
        }
       
        lval = val;
        VICVectAddr         = 0x00;                                                // 通知VIC中断处理结束
        //OS_EXIT_CRITICAL();
}

void        DrawWave(void)
{
        if(Units >= OSC_WINDOW_XMAX)
        {
                int        x;
                int m;
                int dir = 0;
               
                if(Multiply < 128)
                {
                        m = 128 - Multiply;
                        dir = -1;
                }
                else if(Multiply > 128)
                {
                        m = Multiply - 128;
                        dir = 1;
                }
                else
                {
                        m = 0;
                        dir = 0;
                }
               
                for(x=1; x<OSC_WINDOW_XMAX-1; x++)
                {
                        LcdPutYLine(x, 1, 62, 0);
                       
                       
                        if(dir == 0)
                        {
                                LcdPutLine(x-1, (0x3f - (Wave[x-1] & 0x3f)), x, (0x3f - (Wave[x] & 0x3f)), 1);
                        }
                        else if(dir == 1)
                        {
                                LcdPutLine(x-1, (0x3f - (Wave[x-1] & 0x3f) * m), x, (0x3f - (Wave[x] & 0x3f) * m), 1);
                        }
                        else
                        {
                                LcdPutLine(x-1, (0x3f - (Wave[x-1] & 0x3f) / m), x, (0x3f - (Wave[x] & 0x3f) / m), 1);
                        }
                       
                        // 画表格(4 * 4 表格)
                        LcdPutPixel(x, 32, 1);
                        if(x & 0x01)
                        {
                                LcdPutPixel(x, 16, 1);
                                LcdPutPixel(x, 48, 1);
                        }
                       
                        if((x == OSC_WINDOW_XMAX * 1 / 4) || (x == OSC_WINDOW_XMAX * 3 / 4))
                        {
                                int        y;
                                for(y=0; y<128; y+=2)
                                {
                                        LcdPutPixel(x, y, 1);
                                }
                        }
                        else if(x == OSC_WINDOW_XMAX * 2 / 4)
                        {
                                LcdPutYLine(x, 0, 63, 1);
                        }
                }
        }
}

void        TaskInit(void *pdata)
{
        uint8        Enable = 1;
       
        SysInit();
        LcdPutRect(0,0,OSC_WINDOW_XMAX-1,63,1);
        LcdPutStr(OSC_WINDOW_XMAX + 1, 0, "t/div");
        LcdReverseArea(OSC_WINDOW_XMAX, 0, 127, 11);
       
        LcdPutStr(OSC_WINDOW_XMAX + 1, 24, "V/div");
        LcdReverseArea(OSC_WINDOW_XMAX, 24, 127, 35);
       
        for(AdcInit(SampleRate); ; )
        {
                switch(OSGetKey(1))
                {
                        case        KEY_RIGHT:
                                if((SampleRate * 1.25) <= OSC_MAX_SAMPLE_RATE)
                                {
                                        SampleRate *= 1.25;
                                        AdcInit(SampleRate);
                                }
                                break;
                       
                        case        KEY_LEFT:
                                if((SampleRate * 0.8) >= 10)
                                {
                                        SampleRate *= 0.8;
                                        AdcInit(SampleRate);
                                }
                                break;
                       
                        case        KEY_UP:
                                if(Multiply < 128 + 32)        Multiply++;
                                break;
                               
                        case        KEY_DOWN:
                                if(Multiply > 128 - 32)        Multiply--;
                                break;
                               
                        case        KEY_ENTER:
                                switch(TrigMethor)
                                {
                                        case  1: TrigMethor =  0;        break;
                                        case  0: TrigMethor = -1;        break;
                                        case -1: TrigMethor =  1;        break;
                                        default: break;
                                }
                                break;
                       
                        case        KEY_CANCEL:
                                if(Enable)        Enable = 0;
                                else                Enable = 1;
                                break;
                       
                        default:break;
                }
               
                if(Enable && SampStart == 0)
                {
                        SampStart = 1;
                }
                DrawWave();
        }
}



/********************************************************************************************
***                     文件结束                                                          ***       
********************************************************************************************/

出0入4汤圆

发表于 2009-4-23 20:51:02 | 显示全部楼层
顶一下

出0入137汤圆

发表于 2009-4-23 20:54:13 | 显示全部楼层
做记号,帮顶

出0入0汤圆

发表于 2009-4-24 21:28:33 | 显示全部楼层
很不错!

出0入0汤圆

发表于 2009-4-24 22:19:46 | 显示全部楼层
不错

出0入0汤圆

发表于 2009-4-24 22:40:49 | 显示全部楼层
这个似乎更好~

(原文件名:ourdev_439504.jpg)

出0入0汤圆

发表于 2009-4-25 09:05:56 | 显示全部楼层
能做出来的都不错,上面那个彩屏的2.99M的波形都能显示得那么清晰,不容易呢!

出0入0汤圆

发表于 2009-4-26 14:56:16 | 显示全部楼层
7楼那个是60M采样率高速AD做的,当然不一样。

出0入0汤圆

发表于 2009-5-2 14:24:25 | 显示全部楼层
楼上的朋友,有没有资料啊,我也准备做一个但不用LCD的,直接用OLED的来做,这样是不是反应更快啊

出0入0汤圆

发表于 2009-5-24 21:14:10 | 显示全部楼层
7楼的效果的确不错,有成品吗?

出0入0汤圆

发表于 2009-12-12 17:19:43 | 显示全部楼层
楼主做的也不错~~~~~~~呵呵~~~~

有没有试过 最大测量频率是多少???

出0入0汤圆

发表于 2009-12-12 17:24:19 | 显示全部楼层
7楼市魏坤第一版

出0入0汤圆

发表于 2009-12-13 19:21:52 | 显示全部楼层
顶啊!

出0入0汤圆

发表于 2009-12-22 19:32:25 | 显示全部楼层
amrk

出0入0汤圆

发表于 2010-3-4 15:46:37 | 显示全部楼层
都做的很不错啊! 佩服佩服!!!

出0入0汤圆

发表于 2010-3-15 20:18:17 | 显示全部楼层
楼主现在还在做不,我也想DIY玩一玩,我这有2138,2146,2214,2468如果做这个玩我可以提供IC。

出0入0汤圆

发表于 2010-5-11 16:19:41 | 显示全部楼层
楼主,我有兴趣也来玩玩,可以提供点资料不??

出0入0汤圆

发表于 2011-2-8 20:35:01 | 显示全部楼层
支持一下

出0入0汤圆

发表于 2011-2-17 13:21:07 | 显示全部楼层
MARK,佩服佩服~

出0入0汤圆

发表于 2011-5-30 14:01:47 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-8-15 16:17:11 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-28 15:38:28 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-12 21:15:19 | 显示全部楼层
厉害  我也得努力啊

出0入0汤圆

发表于 2011-10-12 23:01:08 | 显示全部楼层
这个真牛

出0入0汤圆

发表于 2011-11-17 12:23:18 | 显示全部楼层
不知道手持示波器的ADC芯片会有什么样的需求

出0入0汤圆

发表于 2011-12-10 20:50:45 | 显示全部楼层
眼馋只会看,不会做    顶 顶  顶

出0入0汤圆

发表于 2011-12-26 00:22:54 | 显示全部楼层
做的不错,学习了

出0入0汤圆

发表于 2012-1-5 23:43:41 | 显示全部楼层
很强大,帮顶

出0入0汤圆

发表于 2012-2-8 19:51:46 | 显示全部楼层
技术指标发一下

出0入0汤圆

发表于 2012-2-8 20:31:38 | 显示全部楼层
不错,挺漂亮

出0入0汤圆

发表于 2012-2-8 20:45:08 | 显示全部楼层
厉害

出0入30汤圆

发表于 2012-2-8 21:07:41 | 显示全部楼层
MARK。

出0入0汤圆

发表于 2012-2-8 22:48:42 | 显示全部楼层
厉害

出0入4汤圆

发表于 2012-2-8 23:04:00 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-8 23:13:30 | 显示全部楼层
厉害

出0入0汤圆

发表于 2012-2-21 00:08:23 | 显示全部楼层
高手们出产品吧

出0入0汤圆

发表于 2012-5-17 12:49:10 | 显示全部楼层
MARK              

出0入0汤圆

发表于 2012-10-19 14:33:54 | 显示全部楼层
cool                                                                        

出0入0汤圆

发表于 2012-10-25 10:08:31 | 显示全部楼层
supper......

出0入0汤圆

发表于 2012-10-29 08:42:55 | 显示全部楼层
楼主威武

出0入0汤圆

发表于 2012-10-29 12:39:58 | 显示全部楼层
我现在捉摸着,如果不用高速AD用什么能够代替呢?

出0入0汤圆

发表于 2013-3-4 09:18:09 | 显示全部楼层
很好,谢谢楼主分享

出0入0汤圆

发表于 2013-5-14 13:46:02 | 显示全部楼层
想请教一下,方波上的干扰最后是怎么消除的

出0入0汤圆

发表于 2013-5-18 21:23:35 | 显示全部楼层
感觉一般....

出0入0汤圆

发表于 2013-7-15 20:51:12 | 显示全部楼层

出0入0汤圆

发表于 2013-8-7 22:41:37 | 显示全部楼层
见识了。学习了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 22:35

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

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