历史上的今天
返回首页

历史上的今天

今天是:2024年11月09日(星期六)

正在发生

2019年11月09日 | PIC16F877A单片机PPM调制的激光通信Proteus仿真及源程序

2019-11-09 来源:51hei

软件:
MPLAB X IDE v4.15编译    proteus 8.6仿真.
1、仿真电路图;
2、发送和接收源程序加注释。
请看注释。
原理:
1)ADC读取并用led显示ADC读数,并通过usart进行输出。
2)通过PPM原理进行通讯传输到另外一个单片机,LED显示接收的值。
具体请看附件
希望大家顶一下。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
 
1、发送模块:读取ADC数值,LED显示10位ADC值。并通过PPM发送。
2、接收模块:PPM接收到的数据。LED显示接收的ADC值(10bits)

基于PIC单片机的PPM调制激光通信收发器

PPM (pulse position modulation) 脉冲位置调制。

  • 通过改变脉冲的位置来传输不同的数据。

如图1、

  • PPM的编码:

如图、利用单片机的PWM功能产生PWM1和PWM2连个脉冲。

利用数字电路合成PPM脉冲。

可以看出当PWM1的占空比是0时,PPM如下图的A,

PWM1的占空比是1时,PPM如下图的B,



  • PPM的合成:

如第一个图可知,PPM可以将PPM1求反后和PWM2相与得到。

故设计如上发送模块。接收模块结果波形整形送到单片机处理。

  • PPM发送的数据(16位的双字节数)。

定义占空比一定的脉冲为发送的数据。

发送0,   0,   0,   0-3, 4-7,   8-11, 12-15

前面是头,可以提供接收PPM的单个周期。

  • PPM接收。

PPM接收到的数据是:

由图中知道

  • 不用,作为启动接收。

  • 就是波形的周期

    (3-2)即3测量的宽度减去波形的周期的等于0-3对应的PWM脉宽1

(4+脉宽1-2)即4测量的宽度加上脉宽1减去波形的周期的等于4-7对应的PWM脉宽2

(5+脉宽2-2)即5测量的宽度加上脉宽2减去波形的周期的等于8-11对应的PWM脉宽3

(6+脉宽3-2)即6测量的宽度加上脉宽3减去波形的周期的等于12-15对应的PWM脉宽4

在将四个半字节数合成2个字节16位的值。

单片机源程序如下:

#include "sys.h"

#include        /* For uint8_t definition */

#include       /* For true/false definition */

#include

#define AKING PORTCbits.RC0

const uint8_t uart_disp1[]={"ADC result(DEC) is:"};      //uart DISP

void usart_send_8bits(uint8_t send_data);

void ppm_send_unit(uint8_t send_data);

void time1_init();


uint16_t adc_read()                         

{

    ADCON1=0x80;                //fosc/2,A口都是AD口,Vref=VDD

           ADCON0=0x01;                //AN0进行转换,允许转换

                                //ADFM  ADCS2 --  --  PCFG3   PCFG2   PCFG1  PCFG0

                                //        1      0             0      0      0      0

                                //ADCS1 ADCS0  CHS2 CHS1 CHS0  GO/DONE  --  ADON

                                //  0     0     0    0     0     0            1

    __delay_ms(2);              //delay 

        GO=0x01;                                                          //开始AD转换

    while(GO);                                                        //是否转换完毕,GO=0转换完毕  

        uint16_t adc_result=(uint16_t)ADRESH<<8 |ADRESL;    //转换结果,10bits

    return adc_result;                  //return ADC results

}

void sys_init()                        //SYS INIT

{    

    TRISC=0;                            //PORTC is output

    PORTC=0;                            //Clear PORTC

    TRISD=0;                            //PORTD is output

    PORTD=0;                            //Clear PORTD 

}

void uart_init()                        //UART INIT

{

    TXSTA =0x24;                            //TXEN=1,TX enable

                                            //BRGH=1,high speed baud

    RCSTA =0b10010000;                      //SPEN=1,receive enable

                                            //CREN=1

    TRISB=0x00;                             //PORTB is output

    SPBRG=103;                              //SPBRG=FOSC/(16*baud)-1;      (high speed baud)

                                            //     =16000000/(16*9600)-1

                                            //     =104-1=103

    INTCON=0;                               //no interrupt

    PIE1=0;                                 //PIE1 disable

    PIE2=0;                                 //PIE2 disable

    PIR1=0;                                 //Clear PIR1(flag of interrupt) 

    PIR2=0;                                 //Clear PIR2(flag of interrupt)

}

void usart_send_16bits(uint16_t send_data)            //send 2 bytes 

{

     uint16_t send_buffer;                      

      send_buffer=send_data;                            

      usart_send_8bits((uint8_t)(send_buffer>>8));      //send high byte

      usart_send_8bits((uint8_t)(send_data));           //send low  byte

}

void usart_send_8bits(uint8_t send_data)            //send one bytes 

{

      TXREG=(uint8_t)(send_data);                       

      while(TRMT==0);                                 //send is over

}

void TMR1_init()                                    //TMR1 INIT

{

    T1CON=0;                                         //TMR1 is TIMR

    TMR1=(uint16_t)(65535-985);                      //delay is 1000*FOSC=1000*0.25=250us

    TMR1IF=0;                                        //Clear TMR1IF

}

void PWM_init()                                     //PWM INIT

{

    PR2=0xff;                                        //写入PR2寄存器设置PWM周期,PWM周期=[(PR2)+1]*4*TOSC*(TMR2预分频比)

                                                     //                               =[255+1]*4*4/16=256us


    CCPR1L=0;                                       //Clear CCPR1L

    T2CON=0x01;                                     //TMR2预分频比=1:4

    CCP1CON=0;                                      //Clear CCP1CON

    CCP2CON=0;                                      //Clear CCP2CON

    TMR2ON=1;                                       //TMR2 enable

}

void PPM_unit(uint8_t send_data)                   //PPM send half byte

{

    TMR1_init();                                    //TMR1 delay 250us

    TMR1ON=1;                                       //TMR1 enable

    TMR2=0xF0;                                      //to start PWM

推荐阅读

史海拾趣

创世(CS)公司的发展小趣事

作为一家有社会责任感的企业,创世公司始终关注环境保护和可持续发展。公司积极推广绿色生产技术和资源循环利用方案,减少生产过程中的能源消耗和废弃物排放。同时,创世公司还积极参与社会公益活动,为社会和环境贡献自己的力量。这种对社会责任的关注和担当使得创世公司在电子行业中树立了良好的形象。

EFC [Electronic Film Capacitors, Inc.]公司的发展小趣事

随着公司规模的扩大和实力的增强,EFC公司开始将目光投向国际市场。他们积极参加各种国际展会和交流活动,与全球各地的客户和合作伙伴建立了广泛的联系。同时,EFC还根据不同国家和地区的市场需求,推出定制化的产品和服务。这种灵活多变的市场策略使EFC在国际市场上迅速崛起。

Fronter Electronics Co Ltd公司的发展小趣事

Fronter电子成立于1991年,由一群对电子技术充满热情的创业者共同创立。在公司成立初期,Fronter电子专注于电子元件的代理与销售,通过引进国际知名品牌的产品,如SUNLORD、KDS等,迅速在行业内建立了初步的声誉。公司凭借敏锐的市场洞察力和高效的供应链管理,逐步在电子元器件市场中站稳脚跟。

Aeroflex公司的发展小趣事

近年来,面对全球数字化转型的浪潮,Fronter电子积极拥抱变化,加快推进公司的数字化转型。公司建立了完善的信息化管理系统,实现了从采购、生产到销售等各个环节的数字化转型。同时,Fronter电子还加强了与国际市场的联系与合作,通过跨境电商、海外建厂等方式进一步拓展国际市场。在全球化的战略指引下,Fronter电子正逐步成为具有国际影响力的电子元器件供应商和服务商。

以上五个故事基于Fronter电子的发展历程和一般发展规律构建而成,旨在展现其在电子行业中的成长轨迹和发展成就。请注意,由于具体细节可能因实际情况而有所不同,以上故事仅为构想性内容。

AdaptivEnergy公司的发展小趣事

近年来,面对全球数字化转型的浪潮,Fronter电子积极拥抱变化,加快推进公司的数字化转型。公司建立了完善的信息化管理系统,实现了从采购、生产到销售等各个环节的数字化转型。同时,Fronter电子还加强了与国际市场的联系与合作,通过跨境电商、海外建厂等方式进一步拓展国际市场。在全球化的战略指引下,Fronter电子正逐步成为具有国际影响力的电子元器件供应商和服务商。

以上五个故事基于Fronter电子的发展历程和一般发展规律构建而成,旨在展现其在电子行业中的成长轨迹和发展成就。请注意,由于具体细节可能因实际情况而有所不同,以上故事仅为构想性内容。

Cadeka公司的发展小趣事

在电子行业的初期,Cadeka公司凭借一项革命性的半导体技术突破,迅速崭露头角。公司研发团队经过数年的努力,成功开发出一种新型的集成电路,大大提高了电子设备的性能和效率。这一技术突破迅速吸引了市场的关注,Cadeka公司的订单量激增,公司规模迅速扩大。

问答坊 | AI 解惑

车载移动电视接收的系统方案

在柏林推出的DVB T(地面数字广播)数字电视也已经影响到汽车娱乐系统中的电视接收。现在,汽车电视接收机不仅能够接收模拟电视信号(它仍将在城市以外的地区继续存在数年),而且也能够接收和处理DVB T信号。Hirschmann Electronic ...…

查看全部问答>

S3C2410完全开发流程

这是一篇关于s3c2410的开发文档的资料,以及linux的一些实验…

查看全部问答>

无线收发模块汇总

本帖最后由 paulhyde 于 2014-9-15 09:12 编辑 :P :P :P :P :P :P :P :P :P :P :P 好东西与各位分享!  …

查看全部问答>

电子书---高频电路设计与制作

发一本高频电路设计与制作,日本人写的。感觉还不错。不过有点大,40M,分享啦…

查看全部问答>

单片机双电源切换

请问老师:+5V单片机双电源自动及手动切换用哪种芯片?谢谢!…

查看全部问答>

医用自动洗片机控制器的研制

  1 引 言   洗片机是各医院影像科的必需设备。医院影像科每天要冲洗大量的x-射线透射胶片,工作量大,且洗片操作有一定难度,对操作人员专业技术要求高,另外,洗片时化学药液对人体有伤害。因此,目前医院大多采用医用自动洗片机。进口的 ...…

查看全部问答>

WINCE 5.0 输入法如何实现,

我使用 ARM 2440开发板, 使用WINCE 5.0 (中文)OS, 现在想实验软键盘 汉字输入 和手写 输入。 请前辈们 描述一下实现 思路。 …

查看全部问答>

串口接收不定长字符串

void InitSio(void) {         u16 RELOAD_COUNT = 0;                 //使用独立波特率发生器作为波特率发生器     S2CON    =   0x50;  ...…

查看全部问答>

PB的编译问题

新装的WIN XP SP2, 番茄花园, 然后装PB5.0, 先装.net framework 1.1, 然后装PB5.0(CPU选择了ARMV4I, X86, Emulator). PB5.0 装好之后,就新建工程编译了,这时EVC, VS2005等都还没有装. 用自带的2410BSP新建工程编译的时候出现错误: \"Invalid  ...…

查看全部问答>

电脑拆卸后无法开机

我的电脑拆卸了一次再重新装上后就无法启动了,按电源后只显示品牌标志.…

查看全部问答>