天宁宁 发表于 2025-7-21 08:30:55

想用Ai8U8K64U PWM驱动BTS7960模块


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

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

主要需知道PWMA_CCR1和PWMA_ARR两个寄存器
怎么计算


/****PWM输出任意周期占空比波形*******/
            #include   "STC8H.h"             //
            #include   "intrins.h"         //
/*************关所有输出*******************************/            
            void Init_io()
            {
               P0M0=0X00;                        //   
               P0M1=0X00;                        //
               P1M0=0X00;                        //   
               P1M1=0X00;                        //
               P2M0=0X00;                        //
               P2M1=0X00;                        //
               P3M0=0X00;                        //   
               P3M1=0X00;                        //
               P5M0=0X00;                        //
               P5M1=0X00;                        //
            }
/******************** 主函数 **************************/
            void main(void)
            {   
            P_SW2|=0X80;
            EA=1;
            Init_io();
            PWMA_CCER1=0x00;                   //写 CCMRx 前必须先清零 CCxE    关闭通道
            PWMA_CCMR1=0x60;                   //设置 PWM1 模式1 输出
            PWMA_CCER1=0x01;                   //使能 CC1E 通道, 高电平有效
            PWMA_CCR1=1;                     //设置占空比时间
            PWMA_ARR=5000;                     //设置周期时间
            PWMA_ENO=0X01;                     //使能PWM1P输出
            PWMA_BKR=0X80;                     //使能主输出 MOEA MOEB
            PWMA_CR1=0X01;                     //开始计时
            while(1)
               {
               
               }                                 //
            }                                     //
            










天宁宁 发表于 2025-7-21 09:35:35



PDF找到TCON
T1CON暂时没有找到


乘风飞扬 发表于 2025-7-21 10:03:20

这是PWM频率计算公式,根据公式可通过PWMx_PSCR与PWMx_ARR寄存器调整PWM输出频率:


而占空比设置寄存器 PWMx_CCRn 正常取值范围在 0~PWMx_ARR 之间。

DebugLab 发表于 2025-7-21 14:03:58

频率(PWM时钟使用SYSCLK):

占空比:
= PWMx_CCRn / PWMx_ARR

DebugLab 发表于 2025-7-21 14:07:47

天宁宁 发表于 2025-7-21 09:35
PDF找到TCON
T1CON暂时没有找到
TCON同时控制定时器0、1,不存在T1CON


天宁宁 发表于 2025-7-21 15:01:40


修改了一下引脚
输出到P2.0 P2.1
等一下再修改频率试试

/******************** 主函数 **************************/
            void main(void)
            {   
            P_SW2|=0X80;
            EA=1;
            Init_io();
            PWMA_PS=0x01;                      //P2.0 P2.1
            PWMA_CCER1=0x00;                   //写 CCMRx 前必须先清零 CCxE    关闭通道
            PWMA_CCMR1=0x60;                   //设置 PWM1 模式1 输出
            PWMA_CCER1=0x01;                   //使能 CC1E 通道, 高电平有效
            PWMA_CCR1=1;                     //设置占空比时间
            PWMA_ARR=5000;                     //设置周期时间
            PWMA_ENO=0X01;                     //使能PWM1P输出
            PWMA_BKR=0X80;                     //使能主输出 MOEA MOEB
            PWMA_CR1=0X01;                     //开始计时
            while(1)
               {
               
               }                                 //
            }                                     //



天宁宁 发表于 2025-7-21 15:42:41

PWMA_PS=0x01指示灯闪烁

PWMA_PS=0x01;修改成PWMA_PS=0X04;                  
目测P2.2无反应
#include   "STC8H.h"             //
            #include   "intrins.h"         //
            #define      uchar unsigned char      //
            #define      uintunsigned int       //
            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<10;SS++)
            {
            OutPut0=0;
            OutPut1=0;
            Delay100ms(50);
            OutPut0=1;
            OutPut1=1;
            Delay100ms(50);
            }
      //      PWMA_PS=0x01;                      //P2.0 P2.1
            PWMA_PS=0X04;                      //P2.2 P2.3
            PWMA_CCER1=0x00;                   //写 CCMRx 前必须先清零 CCxE    关闭通道
            PWMA_CCMR1=0x60;                   //设置 PWM1 模式1 输出
            PWMA_CCER1=0x01;                   //使能 CC1E 通道, 高电平有效
            PWMA_CCR1=1;                     //设置占空比时间
            PWMA_ARR=5000;                     //设置周期时间
            PWMA_ENO=0X01;                     //使能PWM1P输出
            PWMA_BKR=0X80;                     //使能主输出 MOEA MOEB
            PWMA_CR1=0X01;                     //开始计时
            while(1)
               {
               
               }                                 //
            }                                     //
            

天宁宁 发表于 2025-7-21 15:48:32

先把PWMA_CCR1改一下

天宁宁 发表于 2025-7-21 17:50:41

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=0x01;                      //P2.0 P2.1
            PWMA_PS=0X01;                      //P2.2 P2.3
            PWMA_CCER1=0x00;                   //写 CCMRx 前必须先清零 CCxE    关闭通道
            PWMA_CCMR1=0x60;                   //设置 PWM1 模式1 输出
            PWMA_CCER1=0x01;                   //使能 CC1E 通道, 高电平有效
            PWMA_CCR1=100;                     //设置占空比时间
            PWMA_ARR=2000;                     //设置周期时间
            PWMA_ENO=0X01;                     //使能PWM1P输出
            PWMA_BKR=0X80;                     //使能主输出 MOEA MOEB
            PWMA_CR1=0X01;                     //开始计时
            while(1)
               {
               
               }                                 //
            }                                     //
            


页: [1]
查看完整版本: 想用Ai8U8K64U PWM驱动BTS7960模块