- 打卡等级:初来乍到
- 打卡总天数:9
- 最近打卡:2025-06-12 09:52:15
已绑定手机
中级会员
- 积分
- 232
|
#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脚。
请指教,我那里搞错了???
|
|