目录

【pwm是如何控制电机转速】

【89C51系列单片机产生pwm波】

【STC12C5A60S2系列单片机输出PWM】


【pwm是如何控制电机转速】

在本科学习中,学生所做的小车多数为使用lm298n或者tb6612来驱动简单的直流电机,我们需要单片机输出pwm波来控制直流电机转速。

直流电机的PWM调速原理为:通过调节驱动电压脉冲宽度的方式,并与电路中一些相应的储能元件配合,改变了输送到电枢电压的幅值,从而达到改变直流电机转速的目的。

【89C51系列单片机产生pwm波】

89c51单片机没有自带pwm发生器,如果想要使用传统的51单片机产生pwm,只能通过软件模拟的方法来产生pwm。

软件模拟可以分为软件延时和定时器两种方法。

1、软件延时输出pwm

使用延时函数产生频率为1kHz的pwm方波(@12MHz晶振)

#include <reg52.h>sbit pwm = P1^0;void delay100us(unsigned int x)
{unsigned char i;while(--x){i = 20;while (--i);}
}int main(void)
{while(1){pwm = 1;delay100us(6);pwm = 0;delay100us(4);}
}

proteus仿真结果

使用简单的延时函数即可简单地模拟出pwm波。但是这种方法缺点很明显,就是在输出pwm时占用大量机器周期,此时若进行其他操作时会影响pwm的准确度。所以这种方法我们很少使用。

2、定时器产生pwm

使用定时器的溢出中断,在中断服务程序中改变IO口的电平高低,可以在多操作情况下输出比较准确的pwm波形。

比如我们使用定时器0。

定时器工作模式:我们设置定时器0工作模式为方式1,16位自动重载模式,这样可以获得较宽的调频范围。

定时器中断:16位自动重载模式下最多可以记65536个数,一旦超出这个数值,便会进入中断。定时器初值可以使用定时器计算器计算,方便快捷。

使用定时器0产生占空比可调,频率为100Hz的pwm波。

#include <reg52.h>sbit pwm = P1^0;unsigned int PWM = 50; //pwm占空比为50%,可调占空比
unsigned char time = 0;void Time0Init(void)
{TMOD = 0X01;  //定时器工作在方式1(16位定时器)TH0 = 0XFF;       //12M晶振下定时0.01msTL0 = 0X9c;ET0 = 1;           //开定时器1中断EA = 1;TR0 = 1;          //开启定时器
}void Timer0(void) interrupt 1
{TH0 = 0XFF;       //重装初值TL0 = 0X9c;time++;
}void main(void)
{Time0Init();while(1){if(time >= 100)   //PWM周期为100*0.1mstime = 0;if(time < PWM)        pwm = 1;else if(time >= PWM)pwm = 0;}
}

proteus仿真结果

由仿真结果来看,所得波形还是不算很精准,实际应用过程中还会有很多误差,但是这样已经比延时函数产生pwm的结果可靠的多。

【STC12C5A60S2系列单片机输出PWM】

我在做循迹小车时使用的是stc12c5a60s2单片机。stc12c5a60s2单片机集成了两路可编程计数器阵列(PCA)模块,可用于软件定时器、外部脉冲的捕捉、高速输出以及脉宽调制(PWM)输出。

使用stc12c5a60s2单片机的PCA模块可通过程序设定,使其工作于8位PWM模式,通过P13和P14输出。

如下图所示:

PWM输出频率取决于PCA定时器的时钟源。

由于所有模块共用仅有的PCA定时器,所以它们的输出频率相同。各个模块的输出占空比是独立变化的,与使用的捕获寄存器[EPCnL, CCAPnL]有关。当寄存器CL的值小于[EPCnL,CCAPnL]时,输出为低;当寄存器CL的值等于或大于[EPCnL, CCAPnL]时,输出为高。当CL的值由FF变为00溢出时,[EPCnH, CCAPnH]的内容装载到[EPCnL, CCAPnL]中。这样就可实现无干扰地更新PWM。要使能PWM模式,模块CCAPMn寄存器的PWMn和ECOMn位必须置位。

PCA时钟输入源频率由于PWM是8位的,所以

PWM频率 = PCA时钟输入源频率 / 256

PCA时钟输入源可以从以下8种中选择一种: SYSclk,   SYSclk/2,  SYSclk/4,SYSclk/6,SYSclk/8,SYSclk/12, 定时器0的溢出,ECI/P3.4输入。

当某个I/O口作为PWM使用时,该口状态:

PWM之前口的状态 PWM输出时口的状态
弱上拉/准双向 强推挽输出/强上拉输出,要加输出限流电阻1K-10K
强推挽输出/强上拉输出 强推挽输出/强上拉输出,要加输出限流电阻1K-10K
仅为输入/高阻输入 PWM无效
开漏 开漏

------

#include "stc12c5a.h"void PCA_Init(void)
{CCON = 0;             //PCA初始化CMOD = 0x00;           //空闲时不计数,不产生中断,时钟源为Sysclk/12,PWM频率大约为4KHzCL = 0x00;               //PCA低8位清零CH = 0x00;               //PCA高8位清零CCAPM0 = 0x42;           //8位PWM模式,无中断CCAP0H = 0xc0;         //PWM0占空比(调节此处值调节PWM占空比)CCAP0L = 0xc0;           //PWM0占空比(调节此处值调节PWM占空比)CCAPM1 = 0x42;           //8位PWM模式,无中断CCAP1H = 0x40;         //PWM1占空比(调节此处值调节PWM占空比)CCAP1L = 0x40;           //PWM1占空比(调节此处值调节PWM占空比)CR = 1;                  //启动PCA计数器
}/*PWM占空比设置*/
void PWM_Set(unsigned char x,unsigned char y)
{CCAP0H = y;               //设置比较值CCAP0L = y; CCAP1H = x;                //设置比较值CCAP1L = x;
}void main(void)
{P1M0 = 0xff;              //P1口推挽输出P1M1 = 0x00;PCA_Init();               //PCA初始化PWM_Set(0x80,0x80);       //设置占空比while(1);
}

此时产生的就是占空比为50%的PWM波。使用示波器可以在P13和P14口测得PWM输出波形。

单片机PWM输出控制直流电机(89c51系列、stc12c5a60s2系列)相关推荐

  1. 一、PWM 输出控制电机

    PWM 输出控制电机 电机系列 一.PWM 输出控制电机 1 .相关 IO 介绍 2 .编写 PWM 输出库函数 PWM.h PWM.c 3.控制函数 control.h control.c 4.ma ...

  2. PX4飞控之PWM输出控制

    PX4飞控之PWM输出控制 多旋翼电调如好盈XRotor,DJI通用电调等都支持PWM信号来传输控制信号.常用的400Hz电调信号对应周期2500us,一般使用高电平时间1000us~2000us为有 ...

  3. 单片机PWM输出原理与实践

    一.什么是PWM?   PWM(Pulse Width Modulation)脉冲宽度调制,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码.  ...

  4. 单片机 PWM输出 c

    #include<reg52.h> #include<intrins.h>  //包含_nop_(),汇编中的子函数 #define uchar unsigned char s ...

  5. 单片机PWM舵机控制

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.PWM是什么? 二.如何控制舵机? 一.PWM是什么? PWM,英文名Pulse Width Modulation,是脉 ...

  6. 使用舵机PWM信号控制直流电机的转动

    01玩具直流驱动电机模块 下面是由(不知道什么来源)得到的直流电机模块.它具有和舵机相同的控制信号. ▲ PWM控制的直流电机 下面测量控制信号与它的转动之间的关系. 02测量方式 使用 两轴机械臂整 ...

  7. stm32无源蜂鸣器定时器_stm32定时器实现PWM输出控制无源蜂鸣器(HAL)

    (一)PWM概念和原理 脉冲宽度调制(PWM),是英文"Pulse Width Modulation"的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有 ...

  8. 5、SONIX单片机TC0、TC1的pwm输出

    TC0与TC1的功能和使用方法是一样的,所以这里只介绍TC0 与定时器TC0的pwm功能相关的寄存器共有3个;TC0M,TC0C,TC0R 一.TC0M模式寄存器 Bit7 Bit6 Bit5 Bit ...

  9. 压电阀控制器-高频高压输出控制

    特别说明1:本文章用于回顾记录本人制作压电阀控制器的关键技术,本人所制作压电阀控制器已经上市得到应用,特在此对一些关键技术进行回顾记录,欢迎从事压电控制及压电阀相关人员一起讨论. 特别说明2:本系列大 ...

最新文章

  1. DIV弹窗 JS刷新页面
  2. C语言goto语句的使用
  3. ViewController类中得方法和属性的用途
  4. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第36篇]Index Calculus算法
  5. linux用echo显示欢迎信息,我使用过的Linux命令之echo - 显示文本、打印信息
  6. 光源时间_【精品透视】UVLED紫外固化光源崭露头角!
  7. 解决博客园中代码着色问题
  8. TensorFlow总结(2020版)
  9. Java从零开始学十五(继承)
  10. 更好的理解装饰设计模式和代理设计模式
  11. 跨境电商开发,源码无加密
  12. 1288元,苍井空“空系列”内衣微博开卖
  13. HandlerSocket的安装实例及性能测试
  14. 指数函数e^x和对数函数lnx 导数的求导过程
  15. VisualStudio,配置管理器,目标平台,x86,x64,win32 简介
  16. oa项目经验描述_(完整版)简历中的项目经验范文
  17. 机载计算机pdf,机载计算机系的故障诊断.pdf
  18. snprintf的使用
  19. 阿里云购买学生机镜像多种选择
  20. VoLTE / VoIP 网络电话

热门文章

  1. 5G学习总结:RRM(无线资源管理)
  2. oracle 快照过旧:回退段号,ORA-01555: 快照过旧: 回退段号 39 (名称为 _SYSSMU39_3029844184$) 过小...
  3. oracle取日期6,Oracle通过日期获取星座函数
  4. SII-Slave Information Interface
  5. php artisan命令表,php artisan 命令列表
  6. 将Virtualbox虚拟机转换格式并导入Hyper-V
  7. 使用FFmpeg命令实现音视频转码的备忘录
  8. K8S 生态周报| Docker V2 GitHub Action 宣布 GA
  9. 怎么下载网页上的视频m3u4
  10. 网狐荣耀需要什么服务器系统,网狐荣耀服务器负载均衡