天宁宁 发表于 2025-7-23 13:46:48

非常遗憾 搞PWM 三四天P2.2还是没有输出 | 有输出了

感谢大家都鼓励和帮助
下载了很多例程
各种控制比较复杂
寄存器非常多
一时还消化不了

目前我只想由浅入深
先把P2.0和P2.2PWM控制电机正反转实现
程序改了又改 试了又试
搞到筋疲力尽 还是没有输出
程序先进行引脚配置
PWMA_PS |= PWM1_2;               //选择 PWM1_2 通道
PWMA_PS |= PWM2_2;               //选择 PWM2_2 通道

后面的EER MR寄存器还搞不懂


刚刚做了一块PCB板
用P2.0P2.2分别控制电机正反转

先按照官方程序测试效果
目前只实现IO口点亮
还是不知道怎么修改参数
达到工作要求
脉冲频率和占空比可变
参考查阅寄存器 和PWM工作原理
发现PWM控制牵涉的寄存器比较多
做文档研究两三天还不是很明白      

            #include   "STC8H.h"             //
            #include   "intrins.h"         //
            #define      uchar unsigned char      //
            #define      uintunsigned int       //
            #define      ENO1P       0x01
            #define      ENO2P       0x04
            #define      PWM1_2      0x01    //P:P2.0N:P2.1
            #define      PWM2_2      0x04    //P:P2.2N:P2.3
            sbit         OutPut0=P2^0;                   //
            sbit         OutPut1=P2^2;
            uchar      SS;
/*-----------(1)延时子程序12MHz 加千百十个显示--------*/
            void Delay100ms(uint x)            //
            {
            uint i,j;
            for(i=0;i<x;i++)
            for(j=0;j<11000;j++);
            }
/*************关所有输出*******************************/            
            void Init_io()
            {
               P1M0=0X00;                        //   
               P1M1=0X00;                        //
               P2M0=0x05;
               P2M1=0x00;
               P3M0=0X00;                        //   
               P3M1=0X00;                        //
               P5M0=0X00;                        //
               P5M1=0X00;                        //
            }
/******************** 主函数 **************************/
            void main(void)
            {   
            P_SW2|=0X80;
            EA=1;
            Init_io();
            for(SS=0;SS<5;SS++)
            {
            OutPut0=0;
            OutPut1=0;
            Delay100ms(50);
            OutPut0=1;
            OutPut1=1;
            Delay100ms(50);
            }
//      
            PWMA_PS |= PWM1_2;               //选择 PWM1_2 通道
            PWMA_PS |= PWM2_2;               //选择 PWM2_2 通道
            PWMA_CCER1=0x00;                   //写 CCMRx 前必须先清零 CCxE    关闭通道
//            PWMA_CCER2=0x00;                   //写 CCMRx 前必须先清零 CCxE    关闭通道

            PWMA_CCMR1=0x60;                   //设置 PWM1 模式1 输出
            PWMA_CCMR2=0x60;                   //设置 PWM1 模式1 输出

            PWMA_CCER1=0x01;                   //使能 CC1E 通道, 高电平有效

//         PWMA_CCER2=0x01;                   //写 CCMRx 前必须先清零 CCxE    关闭通道
            
            PWMA_CCR1=100;                     //设置占空比时间
            PWMA_CCR2=100;                     //设置占空比时间
            PWMA_ARR=2000;                     //设置周期时间
            PWMA_ENO |= ENO1P; //使能输出
            PWMA_ENO |= ENO2P; //使能输出
            
            PWMA_BKR = 0x80; //使能主输出
            PWMA_CR1 |= 0x81; //ARR预装载,开始计时
            while(1)
               {
               
               }                                 //
            }                                     //

DebugLab 发表于 2025-7-23 14:57:39

PWMA_CCER1错误,应为0x11



https://www.stcaimcu.com/forum.p ... id=19209&pid=177800
频率(PWM时钟使用SYSCLK):

占空比:
= PWMx_CCRn / PWMx_ARR


天宁宁 发表于 2025-7-23 15:01:14

DebugLab 发表于 2025-7-23 14:57
https://www.stcaimcu.com/forum.p ... id=19209&pid=177800
频率(PWM时钟使用SYSCLK):



现在是目测P2.2还没有输出
P2.0有输出的

DebugLab 发表于 2025-7-23 15:14:59

天宁宁 发表于 2025-7-23 15:01
现在是目测P2.2还没有输出
P2.0有输出的

PWMA_CCER1=0x11

天宁宁 发表于 2025-7-23 15:18:08

确实 修改一下有输出了
上午参考测试了很多例程
用|=n 也试过
没有效果搞得灰头土脸
我在试试
谢谢版主

天宁宁 发表于 2025-7-23 15:31:03

DebugLab 发表于 2025-7-23 15:14
PWMA_CCER1=0x11

就是CC1E CC2E理解不明白 谢谢

DebugLab 发表于 2025-7-23 15:34:44

天宁宁 发表于 2025-7-23 15:18
确实 修改一下有输出了
上午参考测试了很多例程
用|=n 也试过

仔细看数据手册


天宁宁 发表于 2025-7-23 15:37:17

DebugLab 发表于 2025-7-23 15:34
仔细看数据手册

数据手册反反复复看了
有些BIT位的意思不是很明白
PWM的寄存器比较多
而且相互关联
只能一步一步摸索
页: [1]
查看完整版本: 非常遗憾 搞PWM 三四天P2.2还是没有输出 | 有输出了