AI8H 互补pwm输出,关闭后无法再次启动
<p>AI8H 互补pwm输出,关闭后无法再次启动。</p><p>以下是我的代码。麻烦各位大佬帮忙看看</p>
<pre><code>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中断处理
}
</code></pre>
<pre><code>// 启动气泵
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;
}
</code></pre>
有没有完整的工程?目前来看并没有问题,操作PWMx_ENO关闭输出和恢复输出是正确的
按道理讲目前的代码是可以正常关闭PWM和打开PWM输出的 #define MAIN_Fosc 24000000L //定义主时钟
#include "STC8Hxxx.h"
/************* 功能说明 **************
先别修改程序, 直接下载"01C-PWMA-PWM间歇输出"里的"pwm.hex"测试, 下载时选择主频24MHz.
本例子PWM输出IO: P1.0、P1.1, 10KHz
PWM输出10ms、暂停10ms.
******************************************/
感谢两位版主,问题已解决。
#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);
voiddelay_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.7P1.6 P1.5P1.4 P1.3P1.2 P1.1P1.0
// 01 P2.7P2.6 P2.5P2.4 P2.3P2.2 P2.1P2.0
// 02 P6.7P6.6 P6.5P6.4 P6.3P6.2 P6.1P6.0
// 03 P3.3P3.4 -- -- -- -- -- --
//========================================================================
// 函数: voiddelay_ms(u8 ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注:
//========================================================================
voiddelay_ms(u8 ms)
{
u16 i;
do
{
i = MAIN_Fosc / 10000;
while(--i) ;
}while(--ms);
}
页:
[1]