历史上的今天
返回首页

历史上的今天

今天是:2024年11月12日(星期二)

正在发生

2019年11月12日 | 一种智能频率计的设计与制作(AVR) 带仿真与源程序和原理图

2019-11-12 来源:51hei

0.png?imageView2/2/w/550 
基于avr单片机的频率计的仿真原理图

0.png?imageView2/2/w/550 

俺毕业设计的小玩意.也许有人可以拿去玩.

当时刚出毕业选题就赶紧的选了这个简单的.免得以后为毕业设计费神.
这是最初的,后来给学校也是交的这个. 花了三天时间.

//*********************11月29日开始毕业选题
读了一点频率计原理,高频记数,低频测周期 规划了一下大体,坚决不用老师指定的51,
//*********************11月30日开始写代码
凑合着开始了,偏差很大,很无聊,晚上跟123JJ在51hei灌水,灌了阵找到思维了,继续写,基本完成
//*********************12月1日调试
写了个串口上位机对数据进行分析和记录,方便多了.仔细的调了下.不管他效率和规范了,出结果了就要得,马虎的收工了.
16MHz晶振,范围1Hz--5MHz,软件仿真测周期误差<1/8us.计数误差最大可能1hz. 当然液晶显示误差就大多了.显示位数有限.随便忽悠一下, 可以给老师交差了.前端信号处理和pcb以后再弄.

后来前端处理参照冬瓜哥的精华帖和建议,把CD4069作运放用.
感谢冬瓜哥给我打板,搭顺路车.

后来在寒假发神经又琢磨了一下,修改下代码,加上些别的东西,反正资源还足够,有些作了测试,有些只是空想,规划和写代码,没有测试.脉宽和占空比,电压表,示波器,欧姆表,信号发生器,温度计,电容表,电感表,逻辑仪,红外分析,弄了5,6天又停了,人太懒.再后来又忘干净了,只记得电容表是测充电时间.
再后来,写毕业论文,网上下了n多资料和论文用来copy,弄的电脑很乱,写到一半,实在太乱,文件整理中,大把的删文件夹,一不小心把软件都删了,还好在qq群共享里留下了这个最初版本.好险.差点作无用功.

0.png?imageView2/2/w/550 

0.png?imageView2/2/w/550 


下面是智能频率计的原理图是用ad画的.
0.png?imageView2/2/w/550 

下面是主程序的源程序:

#ifndef main_c   //test ok

#define main_c

#endif 


#include "main.h"

//************************全局变量


volatile uint t0_cont;


volatile uint t1_cont;

volatile uchar flg1; //

//-------------------------------------------------------------------------

//     测试函数 用来初始化

//-------------------------------------------------------------------------

void test()

{

  send_str( "pinlvji" ); //完成后把所有串口去掉

  showstr( "cymometer", 1, 1, 9 ); //液晶显示

//  showstr( "1KHz", 12, 1, 4 );

  showstr( "Hz", 14, 2, 2 );

}


//-------------------------------------------------------------------------

//mcu初始化 端口 定时器 中断 外中断 变量

//-------------------------------------------------------------------------

void mcu_init()

{

//******************端口

  data_direc = out; //输出

  DDRB = out; //输出

  DDRC = out; //输出

  PORTC = 0X00; //输出0


  DDRB=0XE0;   //输入口       

  PORTB=0XE9;

//********************定时器

  TIMSK |= 0x12; //定时中断允许位 只允许两个匹配

}


//-------------------------------------------------------------------------

//       主函数 

//-------------------------------------------------------------------------

int main()

{

  uchar f_t; //用测频还是测周

//******************

  mcu_init();                 //初始化

  usart_init( 57600 );        //初始化

  send_str( "com ok" ); //完成后把所有串口去掉

  yj_set( 0x38, 0x0f, 0x06 ); //初始化

  clearall(); //初始化

  mzd_on();   //开中断


  #if debug

    test();

  #endif 


  while ( 1 )

  {

    if ( !( PINB& ( 1 << 3 )))

    {

      refish();       //刷新所有的东西

      f_t = hz_try(); //估计范围 1k

      if ( f_t )

      {

        cl_f(); //频率法

      }

      else

      {

        cl_t(); //周期法

      }

    }

  }

  return 1;

}

复制代码

cale.c

#ifndef cale_c

  #define cale_c

  #include "main.h"

//-------------------------------------------------------------------------

// //周期法   先笨方法

//-------------------------------------------------------------------------

  void cale_t( uchar* back )

  {

    ulint count_all; //存放周期 max 16m min 16k

    uint z_sh;      

    ulint y_sh;     

    uchar test;      

//*******************整数小数分离  

    count_all = t1_cont * 50000+TCNT1; 

        if(count_all>max_t)

        count_all=max_t;

    z_sh = max_t / count_all;          

        #if pc

    y_sh=max_t-count_all*z_sh;

        y_sh*=10;

    count_all/=100;

#else

    y_sh = ( max_t % count_all )* 1000; 

#endif

//*******************整数计算部分

    *back++ = z_sh / 100;

    z_sh = z_sh % 100;

    *back++ = z_sh / 10;

    *back++ = z_sh % 10; 

//***************小数计算 

    z_sh = y_sh / count_all; 

    *back++ = z_sh / 100;

    z_sh = z_sh % 100;


    *back = z_sh / 10;

    z_sh = z_sh % 10;

//************做四舍五入计算

    test=0; 

    if ( z_sh >= 5 )

    {

        send_char(z_sh);

      *back += 1; //

      if ( *back == 10 )

      {

            test++;

        *back-- = 0;

        *back += 1; 

        if ( *back == 10 )

        {

            test++;

          *back-- = 0; 

          *back += 1; //

          if ( *back == 10 )

          {

            test++;

            *back-- = 0;

            *back += 1; //

            if ( *back == 10 )

            {

            test++;

              *back-- = 0;

              *back += 1; 

            }

          }

        }

      }

    }

    back-=(4-test); 


//****************转到ascii码

    for ( test = 5; test > 0; test-- )

    {

      *back++ = * back + 0x30;

    }

back-=5;

//****************插进小数点

    back[5] = back[4]; 

    back[4] = back[3];

    back[3] = '.';


//****************去掉不要的0


    for ( test = 3; test > 0; test-- )

    { 

      if ( *back == 0x30 )

      {

        *back++ = * back - 0x30;

      }

      else

      {

        break;

      }

    }

  }


//-------------------------------------------------------------------------

//       //记数法 

//-------------------------------------------------------------------------

  void cale_f( uchar* back )

  {

    ulint count_all;  

    uchar test;       


    count_all = t1_cont * 50000+TCNT1; //原始值

//*****************计算 笨方法计算

    *back++   = count_all / 1000000; //最高位

    count_all = count_all % 1000000; //去掉最高位

    *back++   = count_all / 100000; //100k位

    count_all = count_all % 100000; //去掉

    *back++   = count_all / 10000;

    count_all = count_all % 10000;

    *back++   = count_all / 1000;

    count_all = count_all % 1000;

    *back++   = count_all / 100;

    count_all = count_all % 100;

    *back++   = count_all / 10;   //十位

    *back     = count_all % 10;   //个位


    back = back - 6;


//转到ascii字符

    for ( test = 7; test > 0; test-- )

    {

      *back++ = * back + 0x30;

    }

    back = back - 7; //指针退回

//处理前面的0

    while ( *back == 0x30 )

    {

      *back++ = * back - 0x30;

    }

  }

#endif



推荐阅读

史海拾趣

爱浦电子(AIPULNION)公司的发展小趣事

在产品质量得到保障的同时,爱浦电子也积极开展市场拓展和品牌建设工作。公司积极参加国内外电子展会和技术交流活动,与众多行业伙伴建立了紧密的合作关系。此外,爱浦电子还注重品牌形象的塑造,通过统一的对外标识和全新的VI企业形象,提升了公司整体形象。这些努力使得爱浦电子在市场上逐渐树立起了良好的口碑和品牌形象。

Crystal Semiconductor Corp公司的发展小趣事

随着市场竞争的加剧,Crystal Semiconductor Corp意识到只有不断创新才能在行业中立足。于是,公司加大了对研发的投入,引进了一批高端人才。经过数年的努力,公司成功开发出了一种新型的半导体制程工艺,大幅提高了晶体管的性能和可靠性。这一创新不仅为公司带来了丰厚的利润,也为整个半导体行业树立了新的标杆。

European Crystal Org公司的发展小趣事

面对快速变化的电子市场和技术趋势,ECO始终保持着敏锐的市场洞察力和创新精神。公司不断投入研发资源,探索新的技术方向和产品应用。同时,ECO还积极拓展新的业务领域,如物联网、智能家居等。这些努力为公司的未来发展奠定了坚实的基础,使ECO能够在激烈的市场竞争中保持领先地位。

格莱尔(GLE)公司的发展小趣事

格莱尔积极响应国家“双碳”政策,将绿色生产理念贯穿于企业发展的全过程。公司不仅实现了产品的无铅化生产,还注重节能减排和资源循环利用。通过优化生产工艺、引进环保设备等措施,格莱尔有效降低了生产过程中的能耗和排放,为企业的可持续发展奠定了坚实的基础。

Coors Components Inc公司的发展小趣事

在面对激烈的市场竞争时,Coors Components Inc公司果断调整市场策略,将目标市场从高端用户转向中端市场。通过优化产品线、提升服务质量以及加强品牌营销,公司成功吸引了大量中端市场的消费者。这一策略调整不仅使公司的销售额大幅提升,还为其未来的发展奠定了坚实的基础。

Hilscher Gesellschaft für Systemautomation mbH公司的发展小趣事

随着在高压电源领域的深入发展,HVPSI逐渐参与到行业标准的制定工作中。公司凭借其在技术上的深厚积累和市场经验,为行业标准的制定提供了宝贵的建议和数据支持。这些标准的出台不仅规范了市场秩序,也进一步巩固了HVPSI在行业内的领先地位。

问答坊 | AI 解惑

数字电位器X9511的原理和应用

数字电位器X9511的原理和应用…

查看全部问答>

牛人谈模拟电路理解,受益匪浅

牛人谈模拟电路理解,受益匪浅…

查看全部问答>

最基础的介绍, PROTEL是什么?

很多网友渴望自己设计电路原理图(SCH)、电路板(PCB),同时希望从原始SCH到PCB自动布线、再到成品PCB电路板的设计周期可以缩短到1天以内!是不是不可能呢?当然不是,因为现在的EDA软件已经达到了几乎无所不能的地步!由于电子很重实践,可以说 ...…

查看全部问答>

寻 卫生间照明灯、换气扇自动控制器电路

本帖最后由 paulhyde 于 2014-9-15 09:16 编辑 寻 卫生间照明灯、换气扇自动控制器电路 希望大家帮忙解决 谢谢  …

查看全部问答>

关于wince下OPENGL ES纹理贴图!

OPENGL ES 1.0纹理贴图。请问大家怎么做的啊?调了几天没画面,就一个四边形,没纹理!不知道怎么回事! 谢谢!…

查看全部问答>

eeworld论坛没做好!搞得人很不爽!希望设计者多努力!

弹出下载界面,我点击取消,第二次居然说积分不过!他妈的吗,垃圾啊…

查看全部问答>

vxworks应用程序如何调用shell(reboot)命令?

我的程序在运行到特定时候需要人为的重新的启动系统,我使用了“reboot(2);)语句,用来重新启动系统并清除内存,但是系统没用重新启动,不知道这样使用对不对,是不是需要调用shell命令解释器一类的函数,有没有哪位大侠使用过? 另外再请教一 ...…

查看全部问答>

两个单片机协调问题,

两个单片机读写同一个I2C,我想知道它会不会因为同时读写而起冲突,另外如果会起冲突,请问用什么方法可以让它们分时读写?…

查看全部问答>

编程

我是个嘎新嘎新的新手   现在才上班  过段时间可能要用单片机开发 接口编程方面的东西 但是我什么都不会 现在在看C呢 各位高手能给点意见吗   我要学好什么 谢谢  谢谢…

查看全部问答>

提醒一下想买开发板的兄弟们,千万不要买英蓓特的

                                 去年10月份左右我给他们买了一块STR710开发板,现在他们自己都还没搞定那块板子,却早就开始买了,谁买开发板不是 ...…

查看全部问答>