打印
[应用方案]

新唐n76e003单片机遥控PWM信号检测控制航灯系统

[复制链接]
778|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wang6623|  楼主 | 2023-2-28 23:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
第一次使用学习单片机编程, 使用了n76e003, 主要在检测pwm的信号问题上花了比较多的时间,最后是使用了timer2的0通道来捕捉上升缘,1通道来捕捉下降缘来检测pwm的宽度。

接收机是0-2000us pwm输出,500-1000是基础的pwm, 就是说没有信号也定期输出500(舵机)或1000(油门),这样单片机可以检测到有无信号.

timer0来控制led的开关和闪烁,timer0使用10khz, timer2使用16m的时钟.
#include "N76E003.h"
#include "Common.h"
#include "Delay.h"
#include "SFR_Macro.h"
#include "Function_define.h"


unsigned int pulse_width = 0;
unsigned char rising_cap=1;

#define LED_OFF 0
#define LED_FLASH_SLOW 1
#define LED_FLASH_NORMAL 2
#define LED_FLASH_FAST 3
#define LED_FLASH_ALL_FAST 4

unsigned char led_mod =0;
unsigned int tick;
UINT8 u8TH0_Tmp,u8TL0_Tmp;

/************************************************************************************************************
*    TIMER 0 interrupt subroutine
************************************************************************************************************/
void Timer0_ISR (void) interrupt 1  //interrupt address is 0x000B
{
       
         // interrupt every 10ms
          //clr_TF0;
    TH0 = u8TH0_Tmp;
    TL0 = u8TL0_Tmp;   
    tick++;
         
               
                switch(led_mod)
                {
                        case LED_FLASH_SLOW:
                                //one 1/4 second
                          if(tick < 25)
                                {
                                        set_P01;
                                 
                                }
                                else
                                {
                               
                                        clr_P01;
                                }
                                 set_P00;
                                        set_P02;
                                break;
                        /*
                        case LED_FLASH_NORMAL:
                                break;
                        case LED_FLASH_FAST:
                                break;
                        case LED_FLASH_ALL_FAST:
                                break;*/
                        default:
                                        {
                                        clr_P00;
                                        clr_P01;
                                        clr_P02;
                                }
                                        break;
                }
               
                if(tick>150)
                {
                        tick = 0;       
          }
          
}

/************************************************************************************************************
*    Timer2 Capture interrupt subroutine
************************************************************************************************************/

void Capture_ISR (void) interrupt 12
{
       
       
         if(CAPCON0 & 0x01)
  {
    clr_CAPF0;   
  }
  if(CAPCON0 & 0x02)
  {
    clr_CAPF1;                  
    pulse_width = C1H;
    pulse_width <<= 8;
    pulse_width |= C1L;
               
                if(pulse_width>24000) //1/16m = 0.0000000625   * 24000  ==1500
                {
                        led_mod = LED_FLASH_SLOW;
                                //set_P00;
                }
                else
                {
                         led_mod = LED_OFF;
                //        clr_P00;
                }
                       
  }
}


/************************************************************************************************************
*    Main function
************************************************************************************************************/
void main (void)
{
                Set_All_GPIO_Quasi_Mode;
                //                InitialUART0_Timer3(115200);
                P05_Input_Mode; //PWM Input
                P00_PushPull_Mode;
                P01_PushPull_Mode;
                P02_PushPull_Mode;

                clr_P00;
    clr_P01;
          clr_P02;

                TIMER0_MODE1_ENABLE;
                clr_T0M;  //set div 12  10khz mode;

                u8TH0_Tmp = TIMER_DIV12_VALUE_10ms/256; //every 10 ms
                u8TL0_Tmp = TIMER_DIV12_VALUE_10ms%256;   //every 10 ms
                TH0 =  u8TH0_Tmp;  //set time out
                TL0 = u8TL0_Tmp;   

                TIMER2_CAP0_Capture_Mode;
                IC6_P05_CAP0_RisingEdge_Capture;
                IC6_P05_CAP1_FallingEdge_Capture;


                set_ET0;                                    //enable Timer0 interrupt

                set_ECAP;                                   //Enable Capture interrupt

                set_EA;
                set_TR0;                                    //Timer0 run
                set_TR2;                                    //Triger Timer2


                while(1);
}


使用特权

评论回复
沙发
tpgf| | 2024-5-6 10:51 | 只看该作者
如何保证遥控连接的可靠性呢 需要进行握手信号吗

使用特权

评论回复
板凳
磨砂| | 2024-5-6 13:19 | 只看该作者
有一部分代码好像使用的是汇编语言是吗

使用特权

评论回复
地板
晓伍| | 2024-5-6 14:16 | 只看该作者
磨砂 发表于 2024-5-6 13:19
有一部分代码好像使用的是汇编语言是吗

应该不是汇编语言 可能是使用了宏定义语句

使用特权

评论回复
5
观海| | 2024-5-6 14:54 | 只看该作者
10k这么高的频率 还能看出来闪烁吗

使用特权

评论回复
6
guanjiaer| | 2024-5-6 23:28 | 只看该作者
感觉主函数有点乱  功能之间不够清晰明了

使用特权

评论回复
7
八层楼| | 2024-5-6 23:59 | 只看该作者
可以使用一个定时器输出pwm 同时使用另外一个定时器采集pwm吗

使用特权

评论回复
8
八层楼| | 2024-5-6 23:59 | 只看该作者
在模块使能和中断使能二者之间有米有先后顺序的要求呢

使用特权

评论回复
9
Henryko| | 2024-5-8 21:20 | 只看该作者
用的宏定义还是汇编啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

55

主题

390

帖子

0

粉丝