找回密码
 立即注册
查看: 107|回复: 3

AI8H 互补pwm输出,关闭后无法再次启动

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

3

主题

4

回帖

39

积分

新手上路

积分
39
发表于 2025-6-18 17:31:09 | 显示全部楼层 |阅读模式

AI8H 互补pwm输出,关闭后无法再次启动。

以下是我的代码。麻烦各位大佬帮忙看看

void PWMA_config(void)
{
	// 22mhz
	P_SW2 |= 0x80;		//SFR enable   

	PWMA_PSCR = 0x007F;	// 预分频寄存器, 分频 Fck_cnt = Fck_psc/(PSCR[15:0}+1), 边沿对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)), 中央对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)*2).
	PWMA_DTR  = 0xff;		// 死区时间配置, n=0~127: DTR= n T,   0x80 ~(0x80+n), n=0~63: DTR=(64+n)*2T,  
						//				0xc0 ~(0xc0+n), n=0~31: DTR=(32+n)*8T,   0xE0 ~(0xE0+n), n=0~31: DTR=(32+n)*16T,
	PWMA_ARR = 3455;	// 自动重装载寄存器,  控制PWM周期
	PWMA_CCER1  = 0;
	PWMA_CCER2  = 0;
	PWMA_SR1    = 0;
	PWMA_SR2    = 0;
	PWMA_ENO    = 0;
	PWMA_PS     = 0;
	PWMA_IER    = 0;
//	PWMA_ISR_En = 0;

	PWMA_CCMR1  = 0x68;		// 通道模式配置, PWM模式1, 预装载允许
	PWMA_CCR1   = 1727;		// 比较值, 控制占空比(高电平时钟数)
	PWMA_CCER1 |= 0x0F;		// 开启比较输出, 高电平有效
	PWMA_PS    |= 0;		// 选择IO, 0:选择P1.0 P1.1, 1:选择P2.0 P2.1, 2:选择P6.0 P6.1, 
	PWMA_ENO   |= 0x03;		// IO输出允许,  bit7: ENO4N, bit6: ENO4P, bit5: ENO3N, bit4: ENO3P,  bit3: ENO2N,  bit2: ENO2P,  bit1: ENO1N,  bit0: ENO1P
	PWMA_OISR  |= 0x00;
//	PWMA_IER   |= 0x02;		// 使能中断


	PWMA_BKR    = 0x80;		// 主输出使能 相当于总开关
	PWMA_CR1    = 0x81;		// 使能计数器, 允许自动重装载寄存器缓冲, 边沿对齐模式, 向上计数,  bit7=1:写自动重装载寄存器缓冲(本周期不会被打扰), =0:直接写自动重装载寄存器本(周期可能会乱掉)
	PWMA_EGR    = 0x01;		//产生一次更新事件, 清除计数器和预分频计数器, 装载预分频寄存器的值
//	PWMA_ISR_En = PWMA_IER;	//设置标志允许通道1~4中断处理
}

// 启动气泵
void airPump_Start(void)
{
    if(is_start == 0)
    {
	P_SW2 |= 0x80;		//SFR enable   
	PWMA_ENO   |= 0x03;
        is_start = 1;
        airPumpPwm_Cut = 0;         // 计数器清空
    }
}
// 停止气泵
void airPump_Stop(void)
{
	P_SW2 |= 0x80;		//SFR enable   
	PWMA_ENO   &= ~0x03;
	airPump_Pin_P(0);
	airPump_Pin_N(0);
	is_start = 0;
}
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:508
  • 最近打卡:2025-06-28 10:05:05
已绑定手机
已实名认证

112

主题

2420

回帖

6126

积分

版主

积分
6126
发表于 2025-6-18 18:12:23 | 显示全部楼层
有没有完整的工程?目前来看并没有问题,操作PWMx_ENO关闭输出和恢复输出是正确的
按道理讲目前的代码是可以正常关闭PWM和打开PWM输出的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:106
  • 最近打卡:2025-06-28 00:08:16

75

主题

6163

回帖

1万

积分

超级版主

积分
12930
发表于 2025-6-18 18:14:28 | 显示全部楼层
#define MAIN_Fosc                24000000L        //定义主时钟
#include        "STC8Hxxx.h"

/*************        功能说明        **************
先别修改程序, 直接下载"01C-PWMA-PWM间歇输出"里的"pwm.hex"测试, 下载时选择主频24MHz.
本例子PWM输出IO: P1.0、P1.1, 10KHz
PWM输出10ms、暂停10ms.
******************************************/

01C-PWMA-PWM间歇输出.rar (54.74 KB, 下载次数: 2)


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-06-19 09:09:14
已绑定手机

3

主题

4

回帖

39

积分

新手上路

积分
39
发表于 2025-6-19 09:09:14 | 显示全部楼层
感谢两位版主,问题已解决。



#define MAIN_Fosc                22000000L        //定义主时钟

#include        "STC8Hxxx.h"


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

先别修改程序, 直接下载"01C-PWMA-PWM间歇输出"里的"pwm.hex"测试, 下载时选择主频22MHz.

本例子PWM输出IO: P1.0、P1.1, 50Hz 死区时间50us

PWM输出2s、暂停2s


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

void PWMA_config(void);
void  delay_ms(u8 ms);

/******************** 主函数 **************************/
void main(void)
{

        P10 = 0;
        P1n_push_pull(Pin1+Pin0);

        PWMA_config();

        while (1)
        {
                PWMA_ENO = 0x03;        // IO输出允许,  bit7: ENO4N, bit6: ENO4P, bit5: ENO3N, bit4: ENO3P,  bit3: ENO2N,  bit2: ENO2P,  bit1: ENO1N,  bit0: ENO1P
                delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);
                delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);
                PWMA_ENO &= ~0x03;        // IO输出允许,  bit7: ENO4N, bit6: ENO4P, bit5: ENO3N, bit4: ENO3P,  bit3: ENO2N,  bit2: ENO2P,  bit1: ENO1N,  bit0: ENO1P
                P10 = 0;        P11 = 0;
                delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);
                delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);
        }
}

void PWMA_config(void)
{
        P_SW2 |= 0x80;                //SFR enable

        PWMA_PSCR = 0x007F;        // 预分频寄存器, 分频 Fck_cnt = Fck_psc/(PSCR[15:0}+1), 边沿对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)), 中央对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)*2).
        PWMA_DTR  = 254;                // 死区时间配置, n=0~127: DTR= n T,   0x80 ~(0x80+n), n=0~63: DTR=(64+n)*2T,
                                                //                                0xc0 ~(0xc0+n), n=0~31: DTR=(32+n)*8T,   0xE0 ~(0xE0+n), n=0~31: DTR=(32+n)*16T,
        PWMA_ARR = 3455;        // 自动重装载寄存器,  控制PWM周期
        PWMA_CCER1  = 0;
        PWMA_CCER2  = 0;
        PWMA_SR1    = 0;
        PWMA_SR2    = 0;
        PWMA_ENO    = 0;
        PWMA_PS     = 0;
        PWMA_IER    = 0;

        PWMA_CCMR1  = 0x68;                // 通道模式配置, PWM模式1, 预装载允许
        PWMA_CCR1   = 1727;                // 比较值, 控制占空比(高电平时钟数)
        PWMA_CCER1 |= 0x0F;                // 开启比较输出, 高电平有效
        PWMA_PS    |= 0;                // 选择IO, 0:选择P1.0 P1.1, 1:选择P2.0 P2.1, 2:选择P6.0 P6.1,
        PWMA_ENO   |= 0x03;                // IO输出允许,  bit7: ENO4N, bit6: ENO4P, bit5: ENO3N, bit4: ENO3P,  bit3: ENO2N,  bit2: ENO2P,  bit1: ENO1N,  bit0: ENO1P
        PWMA_OISR  |= 0x02;
        PWMA_CCMR1  = 0x68;                // 通道模式配置, PWM模式1, 预装载允许

        PWMA_BKR    = 0x80;                // 主输出使能 相当于总开关
        PWMA_CR1    = 0x81;                // 使能计数器, 允许自动重装载寄存器缓冲, 边沿对齐模式, 向上计数,  bit7=1:写自动重装载寄存器缓冲(本周期不会被打扰), =0:直接写自动重装载寄存器本(周期可能会乱掉)
        PWMA_EGR    = 0x03;                //产生一次更新事件, 清除计数器和预分频计数器, 装载预分频寄存器的值
}

//        PWMA_PS   = (0<<6)+(0<<4)+(0<<2)+0;        //选择IO, 4项从高到低(从左到右)对应PWM1 PWM2 PWM3 PWM4, 0:选择P1.x, 1:选择P2.x, 2:选择P6.x,
//  PWMA_PS    PWM4N PWM4P    PWM3N PWM3P    PWM2N PWM2P    PWM1N PWM1P
//    00       P1.7  P1.6     P1.5  P1.4     P1.3  P1.2     P1.1  P1.0
//    01       P2.7  P2.6     P2.5  P2.4     P2.3  P2.2     P2.1  P2.0
//    02       P6.7  P6.6     P6.5  P6.4     P6.3  P6.2     P6.1  P6.0
//    03       P3.3  P3.4      --    --       --    --       --    --


//========================================================================
// 函数: void  delay_ms(u8 ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注:
//========================================================================
void  delay_ms(u8 ms)
{
     u16 i;
         do
         {
                 i = MAIN_Fosc / 10000;
                while(--i)        ;
     }while(--ms);
}


回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-28 17:27 , Processed in 0.158653 second(s), 70 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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