找回密码
 立即注册
查看: 48|回复: 1

请教程序问题

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-06-12 09:52:15
已绑定手机

14

主题

29

回帖

232

积分

中级会员

积分
232
发表于 5 天前 | 显示全部楼层 |阅读模式
#include        "config.h"
#include        "STC8H_PWM.h"
#include        "STC8G_H_GPIO.h"
#include        "STC8G_H_NVIC.h"
#include        "STC8G_H_Timer.h"
#include        "STC8G_H_Switch.h"
#include        "STC8G_H_Delay.h"


/*************        功能说明        **************

本例程基于STC8H2K08U ,STC8H系列芯片可通用参考.

高级PWM定时器 PWM1P/PWM1N,PWM2P/PWM2N,PWM3P/PWM3N,PWM4P/PWM4N 每个通道都可独立实现PWM输出,或者两两互补对称输出.

PWM设置对应P32 端口.当T信号=1超过一定时间后让P32口,从较长时间=0,2秒时间,慢慢过渡到=1,不让点火器点火。(P32输出1,2秒时间内占比从0%--过渡到100%)

通过P6口上连接的8个LED灯,利用PWM实现呼吸灯效果.

PWM周期和占空比可以根据需要自行设置,最高可达65535.

下载时, 选择时钟 24MHZ (用户可在"config.h"修改频率).

******************************************/

/*************        本地常量声明        **************/
/*************        本地变量声明        **************/

PWMx_Duty PWMA_Duty;//占空比,这段代码声明了一个名为 PWMA_Duty 的变量,用于设置PWM的占空比。具体来说,PWMx_Duty 是一个类型,而 PWMA_Duty 是一个变量名。
        u16          Pwm_Period =200;   //PWM周期; 小周期约8.35-8.4US

/************************ IO口配置 ****************************/
void        GPIO_config(void)
{
        GPIO_InitTypeDef        GPIO_InitStructure;         //结构定义
        
        GPIO_InitStructure.Pin  = GPIO_Pin_All;         //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作
        GPIO_InitStructure.Mode = GPIO_PullUp;          //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
        GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);      //初始化
}
/***************  PWM初始化函数 *****************/
void        PWM_config(void)
{
        PWMx_InitDefine                PWMx_InitStructure;
        
  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
        PWMx_InitStructure.PWM_Duty    = PWMA_Duty.PWM4_Duty;        //PWM占空比时间, 0~Period
        PWMx_InitStructure.PWM_EnoSelect   = ENO4P | ENO4N;        //输出通道选择,        ENO1P,ENO1N,ENO2P,ENO2N,ENO3P,ENO3N,ENO4P,ENO4N / ENO5P,ENO6P,ENO7P,ENO8P
        PWM_Configuration(PWM4, &PWMx_InitStructure);                        //初始化PWM,  PWMA,PWMB

        PWMx_InitStructure.PWM_Period   = Pwm_Period;                                        //周期时间,   0~65535   //u16 Pwm_Period自己设定
        PWMx_InitStructure.PWM_DeadTime = 0;                                        //死区发生器设置, 0~255
        PWMx_InitStructure.PWM_MainOutEnable= ENABLE;                        //主输出使能, ENABLE,DISABLE
        PWMx_InitStructure.PWM_CEN_Enable   = ENABLE;                        //使能计数器, ENABLE,DISABLE
        PWM_Configuration(PWMA, &PWMx_InitStructure);                        //初始化PWM通用寄存器,  PWMA,PWMB

        PWM4_SW(PWM4_SW_P34_P33);                        //PWM4_SW_P16_P17,PWM4_SW_P26_P27,PWM4_SW_P66_P67,PWM4_SW_P34_P33***************************

        NVIC_PWM_Init(PWMA,DISABLE,Priority_0);
}
/************************ 定时器配置  (MAIN_Fosc / 1000UL);1Ms中断一次****************************/
void        Timer_config(void)
{
        TIM_InitTypeDef                TIM_InitStructure;                  //结构定义
        
        TIM_InitStructure.TIM_Mode      = TIM_16BitAutoReload;  //指定工作模式,   TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
        TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T;         //指定时钟源,     TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
        TIM_InitStructure.TIM_ClkOut    = DISABLE;              //是否输出高速脉冲, ENABLE或DISABLE
        TIM_InitStructure.TIM_Value     = 65536UL - (MAIN_Fosc / 1000UL);   //初值,定T0周期;  
        TIM_InitStructure.TIM_Run       = ENABLE;               //是否初始化后启动定时器, ENABLE或DISABLE
        Timer_Inilize(Timer0,&TIM_InitStructure);               //初始化Timer0          Timer0,Timer1,Timer2,Timer3,Timer4
        NVIC_Timer0_Init(ENABLE,Priority_0);    //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
        
  TIM_InitStructure.TIM_Mode      = TIM_16BitAutoReload;  //指定工作模式,   TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
        TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T;         //指定时钟源,     TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
        TIM_InitStructure.TIM_ClkOut    = DISABLE;              //是否输出高速脉冲, ENABLE或DISABLE
        TIM_InitStructure.TIM_Value     = 65536UL - (MAIN_Fosc / 2000UL);   //初值,定T0周期;  
        TIM_InitStructure.TIM_Run       = ENABLE;               //是否初始化后启动定时器, ENABLE或DISABLE
        Timer_Inilize(Timer1,&TIM_InitStructure);               //初始化Timer0          Timer0,Timer1,Timer2,Timer3,Timer4
        NVIC_Timer1_Init(ENABLE,Priority_0);    //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3

}

/******************** 主函数**************************/
void main(void)
{
        EAXSFR();                /* 扩展寄存器访问使能 */

        PWMA_Duty.PWM4_Duty = 50;
        P34=1;
        P35=1;
        P36=1;
        P37=1;
        GPIO_config();
        Timer_config();
        PWM_config();
        EA = 1;
        while (1)//
        { P34=1;P37=0;
                delay_ms(3);//PWM开
                P34=0;P37=1;
                delay_ms(8); //PWM关,这8MS本应有PWM输出,为何关了?
                P34=1;P37=0;
                delay_ms(3);//PWM开
                P34=0;P37=1;
                delay_ms(1);//PWM关
                PWM4P_OUT_DIS()        ;//禁止 PWM4P 输出
                P34=1;P37=0;
                delay_ms(5);//PWM开,这5MS本没有PWM输出,为何开了?
                P34=0;P37=1;
                delay_ms(5); //PWM关
                PWM4N_OUT_EN();//PWM4P 输出
        }
}

/************
开关PWM图与设置的开关对不上???P34波形,PWM控制放开后,总是低电平,没有P34=1???  本
************************/  
我是想PWM关了后,其他程序控制原由PWM控制输出的P34脚。
请指教,我那里搞错了???

A2.jpg

PWM初始化要先开,A2.zip

477.98 KB, 下载次数: 0

回复

使用道具 举报 送花

3

主题

727

回帖

165

积分

等待验证会员

积分
165
发表于 5 天前 | 显示全部楼层
以下是针对您提到的功能和代码进行的回复,基于对代码的理解和功能说明进行的修改和优化:

代码修改说明

您提供的代码是关于PWM控制电路的编写,您可以根据以下内容进行修改和优化:

1. 功能说明
您提到的代码主要涉及PWM信号的设置和灯泡的呼吸效果控制。具体功能包括:
使用STC8H2K08U和STC8H系列芯片(可通用)实现PWM输出。
制定PWM周期和占空比,使得灯泡在一定时间内亮起。
制定P32信号的阈值,使得灯泡在一定时间内亮起。

2. 代码修改建议
您提供的代码中有一些语法错误和未完成的部分,需要进行修正和优化。以下是修改后的代码示例:

修改后的代码示例
  1. cpp
  2. // 加载配置文件
  3. include "configh"
  4. // 定义PWM信号
  5. // Pwm signals
  6. int Pwm signals = 0;  // 点火器P32的信号
  7. // 频率设置
  8. double configfreq = 24000;  // 24MHZ
  9. // 变量声明
  10. double PwmPeriod = 200;  // 振荡器周期
  11. double PwmDutyCycle;  // 占空比
  12. // 函数声明
  13. void UpdatePWM(void() {
  14.     // 修改PwmPeriod和PwmDutyCycle
  15. }
  16. // 变量初始化
  17. void Initialize(void) {
  18.     // 初始化PwmPeriod和PwmDutyCycle
  19. }
  20. // 实时更新PWM信号
  21. void UpdatePWM(void() {
  22.     if (Pwm signals == Pwm signals + 1) {
  23.         if (Pwm signals >= 0) {
  24.             Pwm signals = 0;
  25.         } else {
  26.             Pwm signals = 65535;
  27.         }
  28.     }
  29.     // 点火器P32的信号
  30.     Pwm signals = (Pwm signals < 32768) ? (Pwm signals + 1) : 0;
  31.    
  32.     // 修改PwmPeriod和PwmDutyCycle
  33.     PwmPeriod = 200;
  34.     PwmDutyCycle = 50;
  35.    
  36.     // 保持占空比的稳定性
  37.     while (Pwm signals == Pwm signals + 1) {
  38.         Pwm signals = 0;
  39.     }
  40. }
  41. // 定时控制灯泡
  42. void ControlLight(void) {
  43.     // 灯泡连接到P6口
  44.     // 灯泡的亮灭控制在特定时间点
  45.     // 可以使用定时器或循环控制灯泡的亮灭
  46.     // 示例代码:
  47.     // while (true) {
  48.     //     // 灯泡亮起
  49.     //     //
  50.     //     // 灯泡熄灭
  51.     //     //
  52.     //     // 灯泡亮起
  53.     //     //
  54.     //     // 灯泡熄灭
  55.     //     // }
  56. }
  57. // 调用函数
  58. void UpdatePWM(void) {
  59.     UpdatePWM();
  60. }
  61. void Initialize(void) {
  62.     Initialize();
  63. }
  64. void ControlLight(void) {
  65.     ControlLight();
  66. }
  67. int main(void) {
  68.     // 调用函数
  69.     UpdatePWM();
  70.     ControlLight();
  71.     return 0;
  72. }
复制代码

使用说明
1. 配置文件:您需要在configh文件中修改频率设置。例如:
  
  1. c
  2.    // 频率设置
  3.    double configfreq = 24000;  // 24MHZ
复制代码

2. 修改频率:在configh文件中修改频率设置,例如:
  
  1. c
  2.    // 频率设置
  3.    double configfreq = 24000;  // 24MHZ
复制代码

3. 调用函数:在主函数中调用UpdatePWM()和ControlLight()来实现PWM信号和灯泡控制。

注意事项
确保PWM信号的阈值设置在灯泡的亮灭时间点。
确保占空比的范围在0到65535之间。
确保灯泡的连接和控制代码与PWM信号的阈值一致。

如果您需要进一步优化代码或解决具体的问题,请提供更多细节。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-16 03:29 , Processed in 0.126809 second(s), 55 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表