[技术问答] 新塘N79E815A单片机PWM的关掉的设置问题

[复制链接]
1448|9
 楼主| 听沙的声音 发表于 2018-11-25 16:39 | 显示全部楼层 |阅读模式
大家好,我想请教一下大家就是我用一个按钮控制N79E815A的P01口的pwm问题。想没按按钮时,没有pwm输出,引脚输出电压为0.一按下按钮时pwm引脚输出占空比50%的电压。就是目前我用的官网提供的程序,然后我把按钮还没按时的程序就调用自己写的占空比为0的程序,因为我想占空比为0,那么该引脚应该会输出电压为0.然后现在的结果是,按钮按与不按都没有pwm的输出。一下是我的程序,请各位指教,非常感谢
  1. #define PWMP            0x0DD
  2. #define PWM0_Duty       0x06F
  3. #define PWM1_Duty       0x06F
  4. #define PWM2_Duty       0x06F
  5. #define PWM3_Duty       0x06F
  6. typedef enum
  7. {
  8.     E_CHANNEL0,
  9.     E_CHANNEL1,
  10.     E_CHANNEL2,
  11.     E_CHANNEL3,
  12. }   E_PWMCNL_SEL;
  13. #include <stdio.h>
  14. #include "N79E81x.h"
  15. #include "Typedef.h"
  16. #include "Define.h"
  17. #include "Common.h"
  18. #include <intrins.h>
  19. #include "Version.h"
  20. #include "Delay.h"
  21. #include <string.h>



  22. sbit key=P0^0;
  23. bit flag=0;
  24. bit sflag=0;
  25. bit a;
  26. bit b;
  27. UINT16 PWM_shadow;

  28. //-----------------------------------------------------------------------------------------------------------
  29. void Init_PWM(void)
  30. {
  31.     PWM_shadow = PWMP;                 
  32.     PWMPH = HIBYTE(PWM_shadow);      
  33.     PWMPL = LOBYTE(PWM_shadow);
  34.     PWMCON0 = 0xD0;     
  35. }
  36. void PWM_Pin_Recover_IO(void)  //复位函数
  37. {
  38.     PWMCON0 = 0x00;//
  39.     PWMCON1 = 0x00;//
  40.     PWMCON2 = 0x00;//
  41.     PWMPH   = 0x00;//
  42.     PWMPL   = 0x00;//
  43.     PWM0H   = 0x00;//
  44.     PWM0L   = 0x01;//
  45.           PWM1H   = 0x00;//
  46.     PWM1L   = 0x01;//
  47.     PWM2H   = 0x00;//
  48.     PWM2L   = 0x01;//
  49.     PWM3H   = 0x00;//
  50.     PWM3L   = 0x01; // PWMP < PWMn Duty, PWM Pin Output High(no-active)
  51.     PWMCON0 = 0xD0;// PWM Run  运行PWM
  52.     _nop_ ();      // NOP   
  53.     PWMCON0 = 0x2F;// PWM Stop
  54. }
  55. void PWM_Channel(E_PWMCNL_SEL Channel)//选择PWM通道
  56. {
  57.      switch(Channel)
  58.      {
  59.          case E_CHANNEL0:
  60.             PWM_shadow=PWM0_Duty;
  61.             PWM0H = HIBYTE(PWM_shadow);// PWM0 Duty (P0.1)
  62.             PWM0L = LOBYTE(PWM_shadow);
  63.             break;
  64.          case E_CHANNEL1:
  65.             PWM_shadow=PWM1_Duty;
  66.             PWM1H = HIBYTE(PWM_shadow);// PWM1 Duty (P1.6)
  67.             PWM1L = LOBYTE(PWM_shadow);
  68.             break;
  69.          case E_CHANNEL2:
  70.             PWM_shadow=PWM2_Duty;
  71.             PWM2H = HIBYTE(PWM_shadow);// PWM2 Duty (P1.7)
  72.             PWM2L = LOBYTE(PWM_shadow);
  73.             break;
  74.          case E_CHANNEL3:
  75.             PWM_shadow=PWM3_Duty;
  76.             PWM3H = HIBYTE(PWM_shadow);// PWM3 Duty (P0.0)
  77.             PWM3L = LOBYTE(PWM_shadow);
  78.             break;
  79.     }
  80.    
  81. }

  82. void PWM_Close(E_PWMCNL_SEL Channel)//选择PWM通道
  83. {
  84.       switch(Channel)
  85.      {
  86.          case E_CHANNEL0:
  87.             PWM_shadow=0x0DD;
  88.             PWM0H = HIBYTE(PWM_shadow);// PWM0 Duty (P0.1)
  89.             PWM0L = LOBYTE(PWM_shadow);
  90.             break;
  91.          case E_CHANNEL1:
  92.             PWM_shadow=0x0DD;
  93.             PWM1H = HIBYTE(PWM_shadow);// PWM1 Duty (P1.6)
  94.             PWM1L = LOBYTE(PWM_shadow);
  95.             break;
  96.          case E_CHANNEL2:
  97.             PWM_shadow=0x0DD;
  98.             PWM2H = HIBYTE(PWM_shadow);// PWM2 Duty (P1.7)
  99.             PWM2L = LOBYTE(PWM_shadow);
  100.             break;
  101.          case E_CHANNEL3:
  102.             PWM_shadow=0x0DD;
  103.             PWM3H = HIBYTE(PWM_shadow);// PWM3 Duty (P0.0)
  104.             PWM3L = LOBYTE(PWM_shadow);
  105.             break;
  106.     }
  107.    
  108. }
  109. void Enabled_Brake_Function(void)      //钳位函数
  110. {
  111.     PWMCON1 = 0x30;               
  112. }   
  113. void Scan(void)//按键子程序
  114. {
  115.          if((a==1)&&(b==1))
  116.          {
  117.                  flag=~flag;
  118.                  a=0;
  119.                  b=0;
  120.    }
  121.    if(key==1)       
  122.    {
  123.                  a=1;
  124.    }       
  125.    if(key==0)       
  126.    {
  127.                  Delay1ms(5);
  128.              if(key==0)
  129.                    {
  130.                      b=1;
  131.              }
  132.    while(key==0);
  133.          }
  134. }
  135. void Disp(void)//led显示程序
  136.         {
  137.                 if(flag==1)
  138.                 {
  139.                   P12=0;
  140.                 P30=0;
  141. PWM_Channel(E_CHANNEL0);                 
  142.       Init_PWM();                       
  143.       Enabled_Brake_Function();      
  144.     }       
  145.     else if(flag==0)       
  146.                 {
  147.                  P12=1;
  148.                   P30=1;
  149. PWM_Close(E_CHANNEL0);                    
  150.       Init_PWM();                        
  151.       Enabled_Brake_Function();         
  152.     }                       
  153.   }
  154. void main(void)
  155. {
  156.              
  157.              P02_Input_Mode;
  158.              P03_Input_Mode;
  159.              P04_Input_Mode;
  160.              P30_Quasi_Mode;                       
  161.              P13_OpenDrain_Mode;
  162.              P12_OpenDrain_Mode;
  163.              P01_PushPull_Mode;
  164.              P07_Input_Mode;
  165.              P05_Input_Mode;
  166.              P11_Input_Mode;
  167.              P10_Quasi_Mode;
  168.              P00_Input_Mode;
  169.              P10=0;
  170.              P01=0;
  171.              flag=0;
  172.                          while(1)
  173.                         {
  174.                           Scan();
  175.                     Disp();
  176.                         }   
  177. }
  178.          
 楼主| 听沙的声音 发表于 2018-11-25 16:44 | 显示全部楼层
我如果不写关掉pwm的程序,就是只在flag==1这个标志位下写PWM程序,在标志位flag=0也就是按钮没按时(或者第二次按想关掉电路时)没写关掉pwm的程序。结果就是在flag==1和flag==0时始终有50%的占空比pwm的输出,这是有道理的,因为在flag==0时我没写关pwm的程序。只是我在flag==0时写上占空比为0的程序后,无论是按按钮还是不按按钮,都没有pwm输出。请问这是什么原因呢,还请高手指点一二,非常感谢
huahuagg 发表于 2018-11-25 19:01 | 显示全部楼层
你应该写两个程序,一个是关闭PWM的,一个是启动PWM并且配置为50%占空比的。
然后设置一个变量,这个变量被按键控制,按下后就将这个变量设置为1,执行PWM输出,如果没有按下就变量为0,然后运行关闭PWM的函数。
huahuagg 发表于 2018-11-25 19:04 | 显示全部楼层
本帖最后由 huahuagg 于 2018-11-25 19:06 编辑

pwm_close();
pwm_open();

main(){

while(1){


if(按下)  key=1;
else key=0;
if(key==1)  
pwm_open();
else
pwm_close();


}

}
huahuagg 发表于 2018-11-25 19:07 | 显示全部楼层
大概就是这么个思路
 楼主| 听沙的声音 发表于 2018-11-25 20:06 | 显示全部楼层
huahuagg 发表于 2018-11-25 19:04
pwm_close();
pwm_open();

谢谢您的回复,我是把开启pwm也就是占空比为50%的函数写在按钮按下时的程序里的,标志位为flag,等于1时开启。在flag=0时我写的是占空比为0的程序。至于将pwm关掉我想的是将占空比设置为0,请问还有什么方法关掉吗?

评论

原来问题出现在我初始化时,使这个端口置0,去掉这条程序引脚置0的程序后发现还是可以。谢谢您的解答  发表于 2018-11-25 20:17
mintspring 发表于 2018-11-25 20:20 | 显示全部楼层
搞定了就好。
643757107 发表于 2018-11-25 22:03 | 显示全部楼层
搞定了,发个贴分享一下代码啊。
 楼主| 听沙的声音 发表于 2018-11-25 23:15 | 显示全部楼层
643757107 发表于 2018-11-25 22:03
搞定了,发个贴分享一下代码啊。

嗯嗯,上面就是我的代码,把初始化的那个P01去掉就好
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

73

帖子

1

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