找回密码
 立即注册
查看: 484|回复: 7

硬件PWM设置后,无波形输出

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:115
  • 最近打卡:2025-03-28 11:36:20

8

主题

42

回帖

384

积分

中级会员

积分
384
发表于 2024-7-4 10:50:48 | 显示全部楼层 |阅读模式
单片机型号:STC8H4K64TL      使能3P (P2.4) 4P(P2.6)



#include "moto_pwm.h"
#include "STC8H_PWM.h"
u8 p3_duty=100;
u8 p4_duty=100;
/***************  PWM始化函数 *****************/

#define PWM3_2      0x10        //P:P2.4  N:P2.5 //
#define PWM4_2      0x40        //P:P2.6  N:P2.7 //
#define ENO3P       0x10
#define ENO4P       0x40

void Pwm_Init_3P(p3_duty) //PWMA的初始化
{
        P_SW2 |= 0x80;
        PWMA_CCER1 = 0X00;
        PWMA_CCMR1 = 0X60; //pwm模式1 配置置位输出
        PWMA_CCER1 = 0x01; //配置通道输出使能和极性

        PWMA_CCR1 = p3_duty; //设置占空比时间
        PWMA_ARR = 500; //设置周期时间
         //3.输入输出的引脚配置
        PWMA_ENO |= ENO3P; //使能PWM3p通道输出         
        PWMA_PS |= PWM3_2;

        PWMA_BKR = 0X80; //使能主输出
        PWMA_CR1 |= 0X01; //启动计数器
}

void Pwm_Init_4P(p4_duty) //PWMA的初始化
{
        P_SW2 |= 0x80;
       
        PWMA_CCER1 = 0X00;
        PWMA_CCMR1 = 0X60; //pwm模式1 配置置位输出
        PWMA_CCER1 = 0x01; //配置通道输出使能和极性

        PWMA_CCR1 = p4_duty; //设置占空比时间
        PWMA_ARR = 500; //设置周期时间
         //3.输入输出的引脚配置
        PWMA_ENO |= ENO4P; //使能PWM3p通道输出         
        PWMA_PS  |= PWM4_2;

        PWMA_BKR = 0X80; //使能主输出
        PWMA_CR1 |= 0X01; //启动计数器
}


经测试2.4  2.6无波形输出,以上设置是否有误,请大家多多指正


回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2024-7-4 11:02:22 | 显示全部楼层
有个问题,,你要控制PWM3 和PWM4  为什么你配置的是PWM1的寄存器?
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:115
  • 最近打卡:2025-03-28 11:36:20

8

主题

42

回帖

384

积分

中级会员

积分
384
发表于 2024-7-4 11:06:57 | 显示全部楼层
是的哦,复制之前的例程没改 丑大了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2024-7-4 11:13:25 | 显示全部楼层
lier378*** 发表于 2024-7-4 11:06
是的哦,复制之前的例程没改 丑大了

别的不知道对不对哦,,CCR   CCMR  肯定是不对 剩下你再看看
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:115
  • 最近打卡:2025-03-28 11:36:20

8

主题

42

回帖

384

积分

中级会员

积分
384
发表于 2024-7-4 16:43:15 | 显示全部楼层
pwm3 与 pwm4  配置模式一样,pwm4输出正常,pwm3输出异常 ,代码修正入下
#include "moto_pwm.h"
#include "STC8H_PWM.h"

u16 p3_duty = 500;
u16 p4_duty = 500;
u16 Period  = 1023;
/***************  PWM始化函数 *****************/

#define PWM3_2      0x10        //P:P2.4  N:P2.5 //
#define PWM4_2      0x40        //P:P2.6  N:P2.7 //

#define ENO3P       0x10
#define ENO4P       0x40

void Pwm_Init_3P(p3_duty) //PWMA的初始化
{
        P_SW2 |= 0x80;
       
        PWMA_CCER2 = 0X00;       
        PWMA_CCMR3 = 0X60; //pwm模式1 配置置位输出
        PWMA_CCER2 = 0x55; //配置通道输出使能和极性

        PWMA_ARR = Period; //设置周期时间       
        PWMA_CCR3 = p3_duty; //设置占空比时间
       
        PWMA_ENO = 0;  //关闭通道
        PWMA_ENO |= ENO3P; //使能PWM3p通道输出         
        PWMA_PS  |= PWM3_2;

        PWMA_BKR = 0X80; //使能主输出
        PWMA_CR1 |= 0X01; //启动计数器
}

void Pwm_Init_4P(p4_duty) //PWMA的初始化
{
        P_SW2 |= 0x80;
       
        PWMA_CCER2 = 0X00;
        PWMA_CCMR4 = 0X60; //pwm模式1 配置置位输出
        PWMA_CCER2 = 0x55; //配置通道输出使能和极性
       
        PWMA_ARR = Period; //设置周期时间
        PWMA_CCR4 = p4_duty; //设置占空比时间
       
        PWMA_ENO = 0;  //关闭通道
        PWMA_ENO |= ENO4P; //使能PWM3p通道输出         
        PWMA_PS  |= PWM4_2;

        PWMA_BKR = 0X80; //使能主输出
        PWMA_CR1|= 0X01; //启动计数器
}
截图202407041642515627.jpg
截图202407041643116396.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6843

积分

论坛元老

积分
6843
发表于 2024-7-4 18:43:40 | 显示全部楼层
lier378*** 发表于 2024-7-4 16:43
pwm3 与 pwm4  配置模式一样,pwm4输出正常,pwm3输出异常 ,代码修正入下
#include "moto_pwm.h"
#include ...

PWM3,PWM4两个初始化函数里面都写了:
PWMA_ENO = 0;  //关闭通道
如果你先调用PWM3初始化函数,再调用PWM4初始化函数,先设置的PWMA_ENO就会被清掉,最终只开启了PWM4P通道。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:115
  • 最近打卡:2025-03-28 11:36:20

8

主题

42

回帖

384

积分

中级会员

积分
384
发表于 2024-7-8 16:59:19 | 显示全部楼层
根据大神的提示 输出正常了,
我这里还存在一个问题:P26设置为PWMA 功能 可以输出正常的波形及占空比,但是确不能完全关断使其输出为0,设置如下
u16 p4_duty = 256;
u16 Period  = 256;
#define ENO4P       0x40

正常输出设置:
void Pwm_Init_4P(p4_duty) //PWMA的初始化
{
        P_SW2 |= 0x80;
       
        PWMA_CCER2 = 0X00;
        PWMA_CCMR4 = 0X60; //pwm模式1 配置置位输出
        PWMA_CCER2 = 0x55; //配置通道输出使能和极性
       
        PWMA_ARR = Period; //设置周期时间
        PWMA_CCR4 = p4_duty; //设置占空比时间
       
        PWMA_ENO = 0;  //关闭通道
        PWMA_ENO |= ENO4P; //使能PWM3p通道输出         
        PWMA_PS  |= PWM4_2;

        PWMA_BKR = 0X80; //使能主输出
        PWMA_CR1|= 0X01; //启动计数器
        P_SW2 &= 0x7f;
}
void Pwm_Init_4P_close() //PWM4P  输出为0
{
        PWMA_ENO &= ~ENO4P;
//        PWMA_ENO = 0;
        P26 = 0;
        delay_ms(5);
}
正常输出波形如图为何不是100% 附图1
异常输出波形(想着PWM输出为0):附图2



截图202407081658103179.jpg
截图202407081659132216.jpg

点评

高级PWM,连续输出0或1有2种方法(以PWM1P为例): 1、使用PWMx_ENO禁止输出PWM,对应IO成为普通IO,禁止PWM输出后,由这个IO直接输出高或低电平。 PWMA_ENO |= 0x01; // 允许PWM1P输出 delay_ms(5);  详情 回复 发表于 2024-7-8 18:32
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12079
发表于 2024-7-8 18:32:20 | 显示全部楼层
lier378*** 发表于 2024-7-8 16:59
根据大神的提示 输出正常了,
我这里还存在一个问题:P26设置为PWMA 功能 可以输出正常的波形及占空比,但 ...

高级PWM,连续输出0或1有2种方法(以PWM1P为例):

1、使用PWMx_ENO禁止输出PWM,对应IO成为普通IO,禁止PWM输出后,由这个IO直接输出高或低电平。
  PWMA_ENO |= 0x01;   // 允许PWM1P输出
  delay_ms(5);        // P1.0输出PWM 5ms
  P10 = 1;            // P1.0输出高电平
  PWMA_ENO &= ~0x01;  // 关闭PWM输出
  delay_ms(5);        // P1.0输出高电平5ms
               
  PWMA_ENO |= 0x01;   // 允许PWM1P输出
  delay_ms(5);        // P1.0输出PWM 5ms
  P10 = 0;            // P1.0输出低电平
  PWMA_ENO &= ~0x01;  // 关闭PWM输出
  delay_ms(5);        // P1.0输出高电平5ms

2、设置PWMx_CCMRn,强制PWM输出有效(高)电平/无效(低)电平。
  PWMA_CCMR1 = (PWMA_CCMR1 & ~0x70) | 0x60;  // PWM正常输出
  delay_ms(5);                               // PWM输出5ms
  PWMA_CCMR1 = (PWMA_CCMR1 & ~0x70) | 0x40;  // 强制PWM输出无效(低)电平
  delay_ms(5);                               // PWM输出低电平5ms
  PWMA_CCMR1 = (PWMA_CCMR1 & ~0x70) | 0x60;  // PWM正常输出
  delay_ms(5);                               // PWM输出5ms
  PWMA_CCMR1 = (PWMA_CCMR1 & ~0x70) | 0x50;  //强制PWM输出有效(高)电平
  delay_ms(5);                               // PWM输出高电平5ms

回复 支持 1 反对 0

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-3 00:54 , Processed in 0.152594 second(s), 97 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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