请教大家,关于STC32G的PWM的使用
请教大家,我正在用STC32G单片机的PWM功能输出一个方波,我希望用PWMA的第一个通道的PWM1P(管脚选为P2.0)输出方波,,PWM1N(P2.1)关掉输出,另作为普通的IO使用。我看STC32G的手册是这样写的“当使用第一组 PWM 定时器输出 PWM 波形时,可单独使能 PWM1P/PWM2P/PWM3P/PWM4P 输出,也可单独使能 PWM1N/PWM2N/PWM3N/PWM4N 输出。例如:若单独使能了 PWM1P 输出,则 PWM1N就不能再独立输出,除非 PWM1P 和 PWM1N 组成一组互补对称输出。”但是我忘记了是在哪里看到的了,说当使用PWM1P输出时,关掉PWM1N的输出,PWM1N就可以作为一个普通IO口使用,我试了下,没有成功,到底是不能这么用呢还是我设置的不对,谢谢。PWMx_ENO寄存器,不作为PWM的通道置0,就可以作为普通IO口使用。设置好IO口模式就可以输入/输出。
乘风飞扬 发表于 2024-3-27 13:23
PWMx_ENO寄存器,不作为PWM的通道置0,就可以作为普通IO口使用。设置好IO口模式就可以输入/输出。
...
谢谢乘风老师的回复,我再试试。 乘风飞扬 发表于 2024-3-27 13:23
PWMx_ENO寄存器,不作为PWM的通道置0,就可以作为普通IO口使用。设置好IO口模式就可以输入/输出。
...
乘风老师:遇到一个奇怪的现象,当我把第一个通道的PWM1P(管脚选为P2.0)当做普通的IO口使用,PWM1N(P2.0)设置为PWM,可以工作,程序如下:
void PWMA_Init(void) //PWMA的初始化
{
EAXFR = 1; //扩展寄存器(XFR)访问使能
PWMA_PSCRH = 0; //1分频
PWMA_PSCRL = 0;
PWMA_ARRH= (u8)(PWM_ARR>>8);
PWMA_ARRL= (u8)(PWM_ARR);
PWMA_CCR1H= (u8)(PWM_CCR>>8);
PWMA_CCR1L= (u8)(PWM_CCR);
//3.输入输出的引脚配置
PWMA_ENO |= 0x01; //关PWM1p(P2.0)通道输出,使能PWM1n(P2.1)通道输出
PWMA_PS |= 0x01; //选择PWM1从P2.0、P2.1引脚输出
//4.输入输出模式设置
PWMA_CCER1 = 0x00;
PWMA_CCMR1 = 0x68; //pwm模式1 配置置位输出
PWMA_CCER1 = 0x04; //开启输出比较通道
PWMA_BKR = 0x80; //使能主输出
PWMA_CR1 |= 0x01; //启动计数器
}
波形如下:上方是P2.0作为普通IO口输出的一个周期为2mS的方波,下方是P2.1用PWM的方式输出的波形。
当我把第一个通道的PWM1P(管脚选为P2.0)当做PWM口使用,PWM1N(P2.1)设置为普通的IO口时,就不行了,P2.0(PWM)没有输出,P2.1还有输出。
程序如下:
void PWMA_Init(void) //PWMA的初始化
{
EAXFR = 1; //扩展寄存器(XFR)访问使能
PWMA_PSCRH = 0; //1分频
PWMA_PSCRL = 0;
PWMA_ARRH= (u8)(PWM_ARR>>8);
PWMA_ARRL= (u8)(PWM_ARR);
PWMA_CCR1H= (u8)(PWM_CCR>>8);
PWMA_CCR1L= (u8)(PWM_CCR);
//3.输入输出的引脚配置
PWMA_ENO |= 0x01; //使能PWM1p(P2.0)通道输出,关PWM1n(P2.1)通道输出
PWMA_PS |= 0x01; //选择PWM1从P2.0、P2.1引脚输出
//4.输入输出模式设置
PWMA_CCER1 = 0x00;
PWMA_CCMR1 = 0x68; //pwm模式1 配置置位输出
PWMA_CCER1 = 0x04; //开启输出比较通道
PWMA_BKR = 0x80; //使能主输出
PWMA_CR1 |= 0x01; //启动计数器
}
波形如下:上方的P2.0(PWM1P)没有输出,下方作为普通IO口的P2.1有输出。这个问题出在哪里?程序哪里设置的不对吗?
撤回 PWMA_ENO设置即可,没有允许输出PWM的IO,就没有PWM功能,可以随意使用其其余功能。 梁工 发表于 2024-3-27 16:01
PWMA_ENO设置即可,没有允许输出PWM的IO,就没有PWM功能,可以随意使用其其余功能。 ...
是不是执行:
PWMA_ENO |= 0x01; //使能PWM1p(P2.0)通道输出,关PWM1n(P2.1)通道输出
这一句?P2.0有PWM有输出,P2.1作为普通IO口使用?
我不知道为什么不行呢。 梁工 发表于 2024-3-27 16:01
PWMA_ENO设置即可,没有允许输出PWM的IO,就没有PWM功能,可以随意使用其其余功能。 ...
梁工您好:您看首贴,P2.0可以作为普通IO口使用,P2.1输出PWM,翻过来就不行了。 本帖最后由 梁工 于 2024-3-27 16:54 编辑
newlined 发表于 2024-3-27 16:12
梁工您好:您看首贴,P2.0可以作为普通IO口使用,P2.1输出PWM,翻过来就不行了。 ...
随意,P2.1输出PWM,P2.0做IO。
主函数:
void main(void)
{
u16 i;
WTST = 0;
CKCON = 0;
P_SW2 |= 0x80; //SFR enable
PWMA_config();
P2M0 = 0;
P2M1 = 0;
while (1)
{
for(i=0; i<100; i++)
{
NOP(10);
}
P20 = ~P20;
}
}
我只是禁止掉P2.0输出PWM,其余P2.1~P2.7继续输出PWM。
PWMA_CCMR1= 0x68; // 通道模式配置, PWM模式1, 预装载允许
PWMA_CCR1H= 400/256; // 比较值, 控制占空比(高电平时钟数)
PWMA_CCR1L= 400%256;
ccer1 |= 0x05; // 开启比较输出, 高电平有效
ps |= 1; // 选择IO, 0:选择P1.0 P1.1, 1:选择P2.0 P2.1, 2:选择P6.0 P6.1,
// eno |= 0x03; // IO输出允许,bit7: ENO4N, bit6: ENO4P, bit5: ENO3N, bit4: ENO3P,bit3: ENO2N,bit2: ENO2P,bit1: ENO1N,bit0: ENO1P
eno |= 0x02; // IO输出允许,bit7: ENO4N, bit6: ENO4P, bit5: ENO3N, bit4: ENO3P,bit3: ENO2N,bit2: ENO2P,bit1: ENO1N,bit0: ENO1P
// PWMA_ISR_En|= 0x02; // 使能中断
下面就是示波器波形,蓝色的是P2.1输出PWM,黄色是P2.0在主程序取反输出。
页:
[1]
2