[应用方案] 新唐n76e003单片机遥控PWM信号检测控制航灯系统

[复制链接]
1012|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的时钟.
  1. #include "N76E003.h"
  2. #include "Common.h"
  3. #include "Delay.h"
  4. #include "SFR_Macro.h"
  5. #include "Function_define.h"


  6. unsigned int pulse_width = 0;
  7. unsigned char rising_cap=1;

  8. #define LED_OFF 0
  9. #define LED_FLASH_SLOW 1
  10. #define LED_FLASH_NORMAL 2
  11. #define LED_FLASH_FAST 3
  12. #define LED_FLASH_ALL_FAST 4

  13. unsigned char led_mod =0;
  14. unsigned int tick;
  15. UINT8 u8TH0_Tmp,u8TL0_Tmp;

  16. /************************************************************************************************************
  17. *    TIMER 0 interrupt subroutine
  18. ************************************************************************************************************/
  19. void Timer0_ISR (void) interrupt 1  //interrupt address is 0x000B
  20. {
  21.        
  22.          // interrupt every 10ms
  23.           //clr_TF0;
  24.     TH0 = u8TH0_Tmp;
  25.     TL0 = u8TL0_Tmp;   
  26.     tick++;
  27.          
  28.                
  29.                 switch(led_mod)
  30.                 {
  31.                         case LED_FLASH_SLOW:
  32.                                 //one 1/4 second
  33.                           if(tick < 25)
  34.                                 {
  35.                                         set_P01;
  36.                                  
  37.                                 }
  38.                                 else
  39.                                 {
  40.                                
  41.                                         clr_P01;
  42.                                 }
  43.                                  set_P00;
  44.                                         set_P02;
  45.                                 break;
  46.                         /*
  47.                         case LED_FLASH_NORMAL:
  48.                                 break;
  49.                         case LED_FLASH_FAST:
  50.                                 break;
  51.                         case LED_FLASH_ALL_FAST:
  52.                                 break;*/
  53.                         default:
  54.                                         {
  55.                                         clr_P00;
  56.                                         clr_P01;
  57.                                         clr_P02;
  58.                                 }
  59.                                         break;
  60.                 }
  61.                
  62.                 if(tick>150)
  63.                 {
  64.                         tick = 0;       
  65.           }
  66.           
  67. }

  68. /************************************************************************************************************
  69. *    Timer2 Capture interrupt subroutine
  70. ************************************************************************************************************/

  71. void Capture_ISR (void) interrupt 12
  72. {
  73.        
  74.        
  75.          if(CAPCON0 & 0x01)
  76.   {
  77.     clr_CAPF0;   
  78.   }
  79.   if(CAPCON0 & 0x02)
  80.   {
  81.     clr_CAPF1;                  
  82.     pulse_width = C1H;
  83.     pulse_width <<= 8;
  84.     pulse_width |= C1L;
  85.                
  86.                 if(pulse_width>24000) //1/16m = 0.0000000625   * 24000  ==1500
  87.                 {
  88.                         led_mod = LED_FLASH_SLOW;
  89.                                 //set_P00;
  90.                 }
  91.                 else
  92.                 {
  93.                          led_mod = LED_OFF;
  94.                 //        clr_P00;
  95.                 }
  96.                        
  97.   }
  98. }


  99. /************************************************************************************************************
  100. *    Main function
  101. ************************************************************************************************************/
  102. void main (void)
  103. {
  104.                 Set_All_GPIO_Quasi_Mode;
  105.                 //                InitialUART0_Timer3(115200);
  106.                 P05_Input_Mode; //PWM Input
  107.                 P00_PushPull_Mode;
  108.                 P01_PushPull_Mode;
  109.                 P02_PushPull_Mode;

  110.                 clr_P00;
  111.     clr_P01;
  112.           clr_P02;

  113.                 TIMER0_MODE1_ENABLE;
  114.                 clr_T0M;  //set div 12  10khz mode;

  115.                 u8TH0_Tmp = TIMER_DIV12_VALUE_10ms/256; //every 10 ms
  116.                 u8TL0_Tmp = TIMER_DIV12_VALUE_10ms%256;   //every 10 ms
  117.                 TH0 =  u8TH0_Tmp;  //set time out
  118.                 TL0 = u8TL0_Tmp;   

  119.                 TIMER2_CAP0_Capture_Mode;
  120.                 IC6_P05_CAP0_RisingEdge_Capture;
  121.                 IC6_P05_CAP1_FallingEdge_Capture;


  122.                 set_ET0;                                    //enable Timer0 interrupt

  123.                 set_ECAP;                                   //Enable Capture interrupt

  124.                 set_EA;
  125.                 set_TR0;                                    //Timer0 run
  126.                 set_TR2;                                    //Triger Timer2


  127.                 while(1);
  128. }


tpgf 发表于 2024-5-6 10:51 | 显示全部楼层
如何保证遥控连接的可靠性呢 需要进行握手信号吗
磨砂 发表于 2024-5-6 13:19 | 显示全部楼层
有一部分代码好像使用的是汇编语言是吗
晓伍 发表于 2024-5-6 14:16 | 显示全部楼层
磨砂 发表于 2024-5-6 13:19
有一部分代码好像使用的是汇编语言是吗

应该不是汇编语言 可能是使用了宏定义语句
观海 发表于 2024-5-6 14:54 | 显示全部楼层
10k这么高的频率 还能看出来闪烁吗
guanjiaer 发表于 2024-5-6 23:28 | 显示全部楼层
感觉主函数有点乱  功能之间不够清晰明了
八层楼 发表于 2024-5-6 23:59 | 显示全部楼层
在模块使能和中断使能二者之间有米有先后顺序的要求呢
八层楼 发表于 2024-5-6 23:59 | 显示全部楼层
可以使用一个定时器输出pwm 同时使用另外一个定时器采集pwm吗
Henryko 发表于 2024-5-8 21:20 | 显示全部楼层
用的宏定义还是汇编啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

71

主题

617

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部