930电子网

 找回密码
 立即注册
艾克姆科技推出最新产品STC32G12K128开发板
查看: 191|回复: 0

PWM控制呼吸灯

[复制链接]

1

主题

1

帖子

27

积分

新手上路

Rank: 1

积分
27
发表于 2024-12-24 12:59:54 | 显示全部楼层 |阅读模式
  1. #include "Config.h"
  2. #include "NVIC.h"
  3. #include "GPIO.h"
  4. #include "STC8H_PWM.h"
  5. #include "Switch.h"
  6. #include "Delay.h"

  7. //初始化
  8. void GPIO_Config(){
  9.         P0_MODE_IO_PU(GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);
  10. }

  11. /***************  串口初始化函数 *****************/
  12. #define PERIOD (MAIN_Fosc/1000)        // 运行周期(运行PWM周期)
  13. PWMx_Duty PWMB_Duty;
  14. void        PWM_config(void)
  15. {
  16.         PWMx_InitDefine                PWMx_InitStructure;
  17.        
  18.     // 配置PWM5
  19.         PWMx_InitStructure.PWM_Mode    =        CCMRn_PWM_MODE1;        //模式,                CCMRn_FREEZE,CCMRn_MATCH_VALID,CCMRn_MATCH_INVALID,CCMRn_ROLLOVER,CCMRn_FORCE_INVALID,CCMRn_FORCE_VALID,CCMRn_PWM_MODE1,CCMRn_PWM_MODE2
  20.         PWMx_InitStructure.PWM_Duty    = PWMB_Duty.PWM5_Duty;        //PWM占空比时间, 0~Period
  21.         PWMx_InitStructure.PWM_EnoSelect   = ENO5P;                                //输出通道选择,        ENO1P,ENO1N,ENO2P,ENO2N,ENO3P,ENO3N,ENO4P,ENO4N / ENO5P,ENO6P,ENO7P,ENO8P
  22.         PWM_Configuration(PWM5, &PWMx_InitStructure);                        //初始化PWM,  PWMA,PWMB

  23.     // 配置PWM6
  24.         PWMx_InitStructure.PWM_Mode    =        CCMRn_PWM_MODE2;        //模式,                CCMRn_FREEZE,CCMRn_MATCH_VALID,CCMRn_MATCH_INVALID,CCMRn_ROLLOVER,CCMRn_FORCE_INVALID,CCMRn_FORCE_VALID,CCMRn_PWM_MODE1,CCMRn_PWM_MODE2
  25.         PWMx_InitStructure.PWM_Duty    = PWMB_Duty.PWM6_Duty;        //PWM占空比时间, 0~Period
  26.         PWMx_InitStructure.PWM_EnoSelect   = ENO6P;                                //输出通道选择,        ENO1P,ENO1N,ENO2P,ENO2N,ENO3P,ENO3N,ENO4P,ENO4N / ENO5P,ENO6P,ENO7P,ENO8P
  27.         PWM_Configuration(PWM6, &PWMx_InitStructure);                        //初始化PWM,  PWMA,PWMB

  28.     // 配置PWM7
  29.         PWMx_InitStructure.PWM_Mode    =        CCMRn_PWM_MODE1;        //模式,                CCMRn_FREEZE,CCMRn_MATCH_VALID,CCMRn_MATCH_INVALID,CCMRn_ROLLOVER,CCMRn_FORCE_INVALID,CCMRn_FORCE_VALID,CCMRn_PWM_MODE1,CCMRn_PWM_MODE2
  30.         PWMx_InitStructure.PWM_Duty    = PWMB_Duty.PWM7_Duty;        //PWM占空比时间, 0~Period
  31.         PWMx_InitStructure.PWM_EnoSelect   = ENO7P;                                //输出通道选择,        ENO1P,ENO1N,ENO2P,ENO2N,ENO3P,ENO3N,ENO4P,ENO4N / ENO5P,ENO6P,ENO7P,ENO8P
  32.         PWM_Configuration(PWM7, &PWMx_InitStructure);                        //初始化PWM,  PWMA,PWMB

  33.     // 配置PWM8
  34.         PWMx_InitStructure.PWM_Mode    =        CCMRn_PWM_MODE2;        //模式,                CCMRn_FREEZE,CCMRn_MATCH_VALID,CCMRn_MATCH_INVALID,CCMRn_ROLLOVER,CCMRn_FORCE_INVALID,CCMRn_FORCE_VALID,CCMRn_PWM_MODE1,CCMRn_PWM_MODE2
  35.         PWMx_InitStructure.PWM_Duty    = PWMB_Duty.PWM8_Duty;        //PWM占空比时间, 0~Period
  36.         PWMx_InitStructure.PWM_EnoSelect   = ENO8P;                                //输出通道选择,        ENO1P,ENO1N,ENO2P,ENO2N,ENO3P,ENO3N,ENO4P,ENO4N / ENO5P,ENO6P,ENO7P,ENO8P
  37.         PWM_Configuration(PWM8, &PWMx_InitStructure);                        //初始化PWM,  PWMA,PWMB

  38.     // 配置PWMB
  39.         PWMx_InitStructure.PWM_Period   = PERIOD-1;                                        //周期时间,   0~65535
  40.         PWMx_InitStructure.PWM_DeadTime = 0;                                        //死区发生器设置, 0~255
  41.         PWMx_InitStructure.PWM_MainOutEnable= ENABLE;                        //主输出使能, ENABLE,DISABLE
  42.         PWMx_InitStructure.PWM_CEN_Enable   = ENABLE;                        //使能计数器, ENABLE,DISABLE
  43.         PWM_Configuration(PWMB, &PWMx_InitStructure);                        //初始化PWM通用寄存器,  PWMA,PWMB

  44.         // 切换PWM通道
  45.         PWM5_SW(PWM5_SW_P00);                                        //PWM5_SW_P20,PWM5_SW_P17,PWM5_SW_P00,PWM5_SW_P74
  46.         PWM6_SW(PWM6_SW_P01);                                        //PWM6_SW_P21,PWM6_SW_P54,PWM6_SW_P01,PWM6_SW_P75
  47.         PWM7_SW(PWM7_SW_P02);                                        //PWM7_SW_P22,PWM7_SW_P33,PWM7_SW_P02,PWM7_SW_P76
  48.         PWM8_SW(PWM8_SW_P03);                                        //PWM8_SW_P23,PWM8_SW_P34,PWM8_SW_P03,PWM8_SW_P77

  49.     // 初始化PWMB的中断
  50.         NVIC_PWM_Init(PWMB,DISABLE,Priority_0);

  51. }


  52. void main(){
  53.         char duty_percent=0;
  54.         char direction=1;
  55.         EAXSFR();        //扩展寄存器访问使能
  56.        
  57.        
  58.         GPIO_Config();
  59.        
  60.        
  61.         PWM_config();
  62.        
  63.         EA=1;
  64.        
  65.         P00=P01=P02=P03=0;
  66.         delay_ms(100);
  67.        
  68.        
  69.         PWMB_Duty.PWM5_Duty=PERIOD * duty_percent/100;
  70.         PWMB_Duty.PWM6_Duty=PERIOD * duty_percent/100;
  71.         PWMB_Duty.PWM7_Duty=PERIOD * duty_percent/100;
  72.         PWMB_Duty.PWM8_Duty=PERIOD * duty_percent/100;
  73.         UpdatePwm(PWMB, &PWMB_Duty);
  74.        
  75.         while(1){
  76.                 delay_ms(10);
  77.                 duty_percent+=direction;
  78.                 if(duty_percent>=100){
  79.                         duty_percent=100;
  80.                         direction=-1;
  81.                 }else if(duty_percent<=0){
  82.                         duty_percent=0;
  83.                         direction=1;
  84.                 }
  85.                
  86.                 PWMB_Duty.PWM5_Duty=PERIOD * duty_percent/100;
  87.                 PWMB_Duty.PWM6_Duty=PERIOD * duty_percent/100;
  88.                 PWMB_Duty.PWM7_Duty=PERIOD * duty_percent/100;
  89.                 PWMB_Duty.PWM8_Duty=PERIOD * duty_percent/100;
  90.                 UpdatePwm(PWMB, &PWMB_Duty);
  91.                
  92.         }
  93. }
复制代码
有大佬可以帮忙看一下为什么这个代码实现不了呼吸灯啊?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|官方淘宝店|930电子网 ( 皖ICP备16000695号-2 )

Copyright © 合肥艾克姆电子科技有限公司
快速回复 返回顶部 返回列表