找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2948|回复: 11
收起左侧

想用STC15W408AS16引脚的单片机PCA功能输出PWM控制电机转速,请大佬们指点指点。

  [复制链接]
ID:731768 发表于 2021-6-5 08:55 来自手机 | 显示全部楼层 |阅读模式
我想用STC15W408AS16引脚的单片机PCA功能输出PWM控制电机转速,在手册上找了如下程序但是不明白怎么用,分为高,中,低,关几个等级用1个按键每按一次转速切换一个等级,如何实现。芯片资料给出P1.0和P1.1引脚分别为CCP1和CCP0,是不是输出PWM就用这两个引脚,还请大佬们指点指点。
程序如下:
#include <reg51.h>
#include"intrins.h"
#define FOSC 11059200L
typedef unsigned char BYTE;
typedef unsigned int  WORD;
sfr    P_SW1    =    0xA2;    //外设功能切换寄存器1
#define CCP_S0 0x10            //P_SW1.4
#define CCP_S1 0x20           //P_SW1.5
sfr    CCON     =    0xD8;       //PCA控制寄存器sbit   CCF0     =    CCON^0; //PCA模块0中断标志
sbit   CCF1     =    CCON^1;  //PCA模块1中断标志sbit   CR       =    CCON^6; //PCA定时器运行控制位
sbit   CF       =    CCON^7; //PCA定时器溢出标志sfr    CMOD     =    0xD9; //PCA模式寄存器
sfr    CL       =    0xE9;        //PCA定时器低字节
sfr    CH       =    0xF9;        //PCA定时器高字节
sfr    CCAPM0   =    0xDA;//PCA模块0模式寄存器sfr    CCAP0L   =    0xEA;//PCA模块0捕获寄存器LOW
sfr    CCAP0H   =    0xFA; //PCA模块0捕获寄存器HIGH
sfr    CCAPM1   =    0xDB;//PCA模块1模式寄存器sfr    CCAP1L   =    0xEB;//PCA模块1捕获寄存器LOW
sfr    CCAP1H   =    0xFB;//PCA模块1捕获寄存器HIGH
sfr    CCAPM2   =    0xDC;//PCA模块2模式寄存器sfr    CCAP2L   =    0xEC;//PCA模块2捕获寄存器LOW
sfr    CCAP2H   =    0xFC;//PCA模块2捕获寄存器HIGH
sfr    PCA_PWM0 =    0xf2;//PCA模块0PWM寄存器sfr    PCA_PWM1 =    0xf3;//PCA模块1PWM寄存器sfr    PCA_PWM2 =    0xf4;//PCA模块2PWM寄存器void main()
{   
    ACC      =    P_SW1;        
    ACC     &=    ~(CCP_S0|CCP_S1);    //CCP_S0=0 CCP_S1=0        
    P_SW1    =    ACC;      //(P1.2/ECI,P1.1/CCP0,P1.0/CCP1,P3.7/CCP2)         
    CCON     =    0;        //初始化PCA控制寄存器                                                                           //PCA定时器停止                                                                           //清除CF标志                                                                           //清除模块中断标志        
    CL       =    0;                   //复位PCA寄存器         
    CH       =    0;        
    CMOD     =    0x02;                //设置PCA时钟源                           //禁止PCA定时器溢出中断        
    PCA_PWM0 =    0x00;                //PCA模块0工作于8位PWM        
    CCAP0H   =    CCAP0L  =  0x20;            //PWM0的占空比为87.5%((100H-20H)/100H)         
    CCAPM0   =    0X42;//PCA模块0为8位PWM模式        
    PCA_PWM1 =    0x40;//PCA模块1工作于7PWM         
    CCAP1H   =    CCAP1L  =  0x20;            //PWM1的占空比为75%((80H-20H)/80H)         
    CCAPM1   =    0X42; //PCA模块1为7位PWM模式        
    PCA_PWM2 =    0x80;//PCA模块2工作于6PWM        
    CCAP2H   =    CCAP2L  =  0x20;            //PWM2的占空比为50%((40H-20H)/40H)         
    CCAPM2   =    0X42;//PCA模块2为6位PWM模式         
    CR       =    1;             //PCA定时器开始工作         
    while(1);
}
回复

使用道具 举报

ID:213173 发表于 2021-6-5 10:36 | 显示全部楼层
这是一个STC15W408AS的PWM初始化函数,在主函数或其它函数改写CCAP0H和CCAP1H就可以改变PWM0和PWM1的占空比。P1.0和P1.1是PWM1和PWM0的默认输出脚,可以通过设置AUXR1(P_SW1)寄存器在3组端口来回切换。
void PWM_Init(void)
{
        CCON = 0;                                //初始化PCA控制寄存器
        CL = 0;                 //复位PCA寄存器
        CH = 0;                 //复位PCA寄存器
//        CMOD = 0x00;                         //设置PCA时钟源,PWM频率=11.0592MHZ/12/256=3.600KHZ 278us
//        CMOD = 0x02;                         //设置PCA时钟源,PWM频率=11.0592MHZ/2/256=21.600KHZ 46us
//        CMOD = 0x04;                         //设置PCA时钟源,PWM频率=11.0592MHZ/1~65536/256=43.200KHZ~0.659HZ
//        CMOD = 0x06;                         //设置PCA时钟源,PWM频率= 外部时钟/1/256
//        CMOD = 0x08;                         //设置PCA时钟源,PWM频率=11.0592MHZ/1/256=43.200KHZ 23us
//        CMOD = 0x0A;                         //设置PCA时钟源,PWM频率=11.0592MHZ/4/256=10.800KHZ 93us
//        CMOD = 0x0C;                         //设置PCA时钟源,PWM频率=11.0592MHZ/6/256=7.200KHZ 139us
        CMOD = 0x0E;                         //设置PCA时钟源,PWM频率=11.0592MHZ/8/256=5.400KHZ 185us
        PCA_PWM0 = 0x00;        //PCA模块0工作于8位PWM
        PCA_PWM1 = 0x00;        //PCA模块1工作于8位PWM
        CCAP0H = CCAP0L = 0xFF; //PWM0的占空比为0%
        CCAP1H = CCAP1L = 0xFF; //PWM1的占空比为0%       
        CCAPM0 = 0x42;                        //允许CCP0脚用作脉宽调节输出
        CCAPM1 = 0x42;          //允许CCP1脚用作脉宽调节输出
        CR = 1;                 //PCA定时器开始工作
}

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:94031 发表于 2021-6-5 10:43 | 显示全部楼层
这是个PWM控制的初始化程序,在这个基础上加上你的其他程序。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:272119 发表于 2021-6-5 13:32 | 显示全部楼层
我刚做调试,可以调用PCA_Init (占空比值)来设置占空比做调速, 设置6位模式是100%做63级细分,设置7位模式是100%做127级细分,设置8位模式是100%做254级细分,足够使用了.

#include <15W204S.h>
//#include "intrins.h"
#define CCP_S0 0x10                 //P_SW1.4
#define CCP_S1 0x20                 //P_SW1.5

void PWM_Inte()
{
    ACC = P_SW1;
    ACC &= ~(CCP_S0 | CCP_S1);      //CCP_S0=0 CCP_S1=1
    ACC |= CCP_S1;                  //(P2.4/ECI_3, P2.5/CCP0_3, P2.6/CCP1_3, P2.7/CCP2_3)
    P_SW1 = ACC;
    //    ACC = P_SW1;
    //   ACC &= ~(CCP_S0 | CCP_S1);      //CCP_S0=0 CCP_S1=0
    //    P_SW1 = ACC;                    //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2)

    //  ACC = P_SW1;
    //  ACC &= ~(CCP_S0 | CCP_S1);      //CCP_S0=1 CCP_S1=0
    //  ACC |= CCP_S0;                  //(P3.4/ECI_2, P3.5/CCP0_2, P3.6/CCP1_2, P3.7/CCP2_2)
    //  P_SW1 = ACC;
    CCON = 0;                       //初始化PCA控制寄存器
    //PCA定时器停止
    //清除CF标志
    //清除模块中断标志
    CL = 0;                         //复位PCA寄存器
    CH = 0;
    CMOD = 0x0000;                    //设置PCA时钟源

}

void PCA_Init (uint osc)
{
    //禁止PCA定时器溢出中断
    //PCA_PWM0 =0x80;                //PCA模块0工作于8位PWM
    //CCAP0H = CCAP0L = osc;         //PWM0的占空比为87.5% ((100H-20H)/100H)
    //CCAPM0 = 0x42;                  //PCA模块0为8位PWM模式

    PCA_PWM1 = 0x40;                //PCA模块1工作于7位PWM
    CCAP1H = CCAP1L = osc;         //PWM1的占空比为75% ((80H-20H)/80H)
    CCAPM1 = 0x42;                  //PCA模块1为7位PWM模式

    PCA_PWM2 = 0x20;                //PCA模块2工作于6位PWM
    CCAP2H = CCAP2L = osc;         //PWM2的占空比为50% ((40H-20H)/40H)
    CCAPM2 = 0x42;                  //PCA模块2为6位PWM模式
    CR = 1;                         //PCA定时器开始工作
}
void PCA_off (void)
{
    //CR = 0;
    CCON = 0;                       //初始化PCA控制寄存器
    //PCA定时器停止
    //清除CF标志
    //清除模块中断标志
}

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:731768 发表于 2021-6-6 10:29 来自手机 | 显示全部楼层
wulin 发表于 2021-6-5 10:36
这是一个STC15W408AS的PWM初始化函数,在主函数或其它函数改写CCAP0H和CCAP1H就可以改变PWM0和PWM1的占空比 ...

需要把AUXR1(P_SW1)改成什么可以切换成默认的输出端口
回复

使用道具 举报

ID:230742 发表于 2021-6-6 15:50 | 显示全部楼层
不用改吧,默认的就是默认的输出端口了。
回复

使用道具 举报

ID:731768 发表于 2021-6-6 15:52 来自手机 | 显示全部楼层
啤酒瓶子老大 发表于 2021-6-6 15:50
不用改吧,默认的就是默认的输出端口了。

我用的P1.0和P1.1引脚
回复

使用道具 举报

ID:731768 发表于 2021-6-6 16:17 来自手机 | 显示全部楼层
wulin 发表于 2021-6-5 10:36
这是一个STC15W408AS的PWM初始化函数,在主函数或其它函数改写CCAP0H和CCAP1H就可以改变PWM0和PWM1的占空比 ...

请问我需要改输出端口为P1.0和P1.1是改这里吗?如果是应该改成什么呀
#define CCP_S0 0x10            //P_SW1.4
#define CCP_S1 0x20           //P_SW1.5
回复

使用道具 举报

ID:213173 发表于 2021-6-6 17:44 | 显示全部楼层
jsq2020 发表于 2021-6-6 16:17
请问我需要改输出端口为P1.0和P1.1是改这里吗?如果是应该改成什么呀
#define CCP_S0 0x10            / ...

默认就是什么都不需要做。
回复

使用道具 举报

ID:731768 发表于 2021-6-6 17:47 来自手机 | 显示全部楼层
wulin 发表于 2021-6-6 17:44
默认就是什么都不需要做。

这里写的1.4和1.5什么意思
回复

使用道具 举报

ID:213173 发表于 2021-6-6 18:13 | 显示全部楼层
jsq2020 发表于 2021-6-6 17:47
这里写的1.4和1.5什么意思

默认就是什么都不需要做。这两条也可以不写
#define CCP_S0 0x10            //P_SW1.4
#define CCP_S1 0x20           //P_SW1.5 无标题.jpg

回复

使用道具 举报

ID:731768 发表于 2021-6-11 10:35 来自手机 | 显示全部楼层
明白了,已经可以用了
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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