【STC8】电机驱动控制(PCA+L298N+PWM+DAC+直流电机+编码器+H桥)

这篇博客介绍了如何使用STC8单片机进行电机驱动控制,涉及PCA模块输出PWM,通过PWM控制直流电机、伺服电机,以及编码器的使用来测量转速。讲解了PCA输出不同位数的PWM,捕获测量脉冲宽度,还探讨了L298N驱动芯片和H桥电路的应用。
摘要由CSDN通过智能技术生成

预备知识

编码器

编码器:测转速

在下降沿或这上升沿的时候,检测两个端口的值。

image.png

脉冲信号的周期定为2Π,就可以理解啦

image.png

image.png

PWM

定时器实现PWM

第19讲-直流电机之PWM控制

IMG_693220220411-142030.jpg

IMG_693320220411-142034.jpg

IMG_693520220411-142807.jpg

IMG_693420220411-142239.jpg

IMG_693620220411-142830.jpg

IMG_693920220411-143047.jpg

STC8-PWM/DAC

频率决定其周期。

频率一般取1KHZ。

模拟电压值:电压*占空比

PWM

最高的精度是2^15次方(32768)。

  1. 根据频率得出周期值。
  2. 算出占空比对应的周期,以它为最小单位,开始往上加。

DAC

  1. 配置主频
  2. 配置精度
  3. 什么时候高,什么时候低

PWM控制舵机(伺服电机)

image.png

0.5ms/20ms*100 =2.5%(0°)

2.5ms/20ms*100= 12.5%(180°)

1.5ms/20ms*100 = 7.5% (中间)

例程:19.2.1 输出任意周期和任意占空比的波形

PWMCR = 0x80; //启动 PWM 模块

void main()
{
 P_SW2 = 0x80;	 
 PWMCKS = 0x00; // PWM 时钟为系统时钟
 PWMC = 0x1000; //设置 PWM 周期为 1000H 个 PWM 时钟
 PWM0T1= 0x0100; //在计数值为 100H 地方输出低电平
 PWM0T2= 0x0500; //在计数值为 500H 地方输出高电平
 PWM0CR= 0x80; //使能 PWM0 输出
 P_SW2 = 0x00;

 PWMCR = 0x80; //启动 PWM 模块

 while (1);
}

第三行:外设端口切换控制寄存器2的EAXFR置1

image.png

第四行:image.png

第六行和第七行:image.png

第八行:允许第0通道PWM中断image.png

第十一行:允许计数器中断image.png

结果:

image.png

输出2.70KHZ

计算公式:1/(11.0592*1000000*4096(1000H))

例程:19.2.2 两路PWM实现互补对称带死区控制的波形

实际上输出互补的两个波形

image.png

例程:19.2.3 PWM实现渐变灯(呼吸灯)

#define CYCLE           0x1000

void PWM_Isr() interrupt 22
{
    static bit dir = 1;
    static int val = 0;
    char store;

    if (PWMCFG & 0x80)//PWM计数器归零中断标志位 
//当15位的PWM计数器记满溢出归零时,硬件自动将此位置1,并向CPU提出中断请求,此标志
//位需要软件清零。
    {
        PWMCFG &= ~0x80;                        //清中断标志
        if (dir)
        {
            val++;
            if (val >= CYCLE) dir = 0;
        }
        else
        {
            val--;
            if (val <= 1) dir = 1;
        }
  
        store = P_SW2;
        P_SW2 |= 0x80;
        PWM0T2 = val;
        P_SW2 = store;
    }
}

void main()
{
    P_SW2 = 0x80;		//开启读取外部寄存器指令
    PWMCKS = 0x00;                              // PWM时钟为系统时钟
    PWMC = CYCLE;                               //设置PWM周期为
    PWM0T1= 0x0000;             //计时器的值
    PWM0T2= 0x0001;             //
    PWM0CR= 0x80;                               //使能PWM0输出
    P_SW2 = 0x00;		//关闭读取外部寄存器指令

    PWMCR = 0xc0;                               //启动PWM模块
//使能PWM波形发生器,PWM计数器开始计数
//ENPWM控制位既是整个PWM模块的的使能位,也是PWM计数器开始计数的控制位。在PWM
//计数器计数的过程中,ENPWM控制位被关
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值