文章目录

  • 前言
  • PWM产生原理
    • TB(Time Base时基)模块
    • 比较输出模块
  • 代码配置

前言

PWM(全称Pulse Width Modulation,定频调宽度调制技术),是近年来发展的一种电力电子技术,广泛应用于开关电源,电能变换领域,以及电机驱动等众多领域。PWM本质上是高频率,但占空比可能变化的脉冲波

产生专门产生PWM信号的集成芯片,也可以使用MCU或者DSP进行配置产生PWM。数字控制器生成PWM具有灵活方便的优点,因此广泛使用控制器产生期望的PWM进行控制。

STC16F系列的单片机内部集成有PWMA,PWMB类高级PWM。PWMA有8个通道,PWMA1P,PWMA1N到PWMA4P,PWMA4N。

每一个PWMxP和对应的PWMxN互为一组PWM。可以输出带死区互补对称PWM。而PWMB只有4个通道,分别是PWM5,PWM6,PWM7,PWM8.

实际开发产品的过程中,基本上都有可能使用到互补对称的PWM波,并且STC16F系列的PWMA类的PWM通道完全够用。因此只需要掌握PWMA的配置方式以及使用方法即可。

PWM产生原理

TB(Time Base时基)模块


CK_PSC是主时钟,经预分频器分频后,作为16位计数器[PWM1_CNTRH:PWM1_CNTRL]的计数脉冲。
这个计数器有3种计数模式,向上计数,向下计数或中央对齐模式。


当16位计数器溢出之后,会重新装载重装值进行下一次计数。(类似于定时器的自动重装载模式)

重复计数寄存器PWM1_RCR用于设置多少次计数器溢出产生一次更新时间。

比较输出模块

比较输出模块的主要功能是将TB模块中的定时器与一个16位的寄存器[CCRxH:CCRxL]中的值作比较。
当PWMx_CNT<[CCRxH:CCRxL]以及PWMx_CNT>[CCRxH:CCRxL]时,PWM输出端口的极性。

一种PWM波形配置

代码配置

综上所述,只需要对PWMx的TB模块和输出比较模块进行相应的配置即可输出对应的PWM波。但是由于STC16F系列的PWM输出端口很灵活,可以根据软件配置在不同的IO口输出PWM。

编写pwm.c文件

#include "STC16f.h"
#include "pwm.h"
#include "led.h"int PWM1_Duty = 0.1 * TBPRD;
int PWM2_Duty = 0.1 * TBPRD;
int PWM3_Duty = 0.5 * TBPRD;
int PWM4_Duty = 0.9 * TBPRD;  void Init_PWMA()
{P_SW2 |= 0x80; PWMA_CCER1 = 0x00; // PWMA的所有通道PWMA_CCER2 = 0x00; // // 预分频设置PWMA_PSCRH = (PreScale-1) >> 8;PWMA_PSCRL = PreScale-1;// 写PWMA的动作// PWM_CCMRx 寄存器用于配置PWMAx通道PWMA_CCMR1 = 0x60; // upcount,CNT<CCR output 1PWMA_CCMR2 = 0x60;PWMA_CCMR3 = 0x60;PWMA_CCMR4 = 0x60;// CCER1 configures PWM1/2, 使能和输出极性// CCER2 configures PWM3/4, 使能和输出极性PWMA_CCER1 = 0x55; PWMA_CCER2 = 0x55;// 设置载波计数周期PWMA_ARRH = (TBPRD - 1) >> 8;PWMA_ARRL = TBPRD - 1;// 使能输出PWMA_ENO = 0x00;PWMA_ENO |= ENO1P; //使能输出
//    PWMA_ENO |= ENO1N; //使能输出PWMA_ENO |= ENO2P; //使能输出
//    PWMA_ENO |= ENO2N; //使能输出
//    PWMA_ENO |= ENO3P; //使能输出
//    PWMA_ENO |= ENO3N; //使能输出
//    PWMA_ENO |= ENO4P; //使能输出
//    PWMA_ENO |= ENO4N; //使能输出PWMA_CCR1H = ((unsigned int)PWM1_Duty >> 8); //设置占空比时间PWMA_CCR1L = ((unsigned int)PWM1_Duty);PWMA_CCR2H = ((unsigned int)PWM2_Duty >> 8); //设置占空比时间PWMA_CCR2L = ((unsigned int)PWM2_Duty);PWMA_CCR3H = ((unsigned int)PWM3_Duty >> 8); //设置占空比时间PWMA_CCR3L = ((unsigned int)PWM3_Duty);PWMA_CCR4H = ((unsigned int)PWM4_Duty >> 8); //设置占空比时间PWMA_CCR4L = ((unsigned int)PWM4_Duty);
//   选择输出脚位PWMA_PS = 0x00;  //高级 PWM 通道输出脚选择位PWMA_PS |= PWM1_2; //选择 PWM1_2 通道PWMA_PS |= PWM2_2; //选择 PWM2_2 通道PWMA_PS |= PWM3_2; //选择 PWM3_2 通道PWMA_PS |= PWM4_2; //选择 PWM4_2 通道// 设置死区PWMA_DTR = 50; // 50*10e-6// 设置PWMA中断
//  PWMA_IER |= 0x01; // 更新时中断
//  PWMA_IER |= 1<<1; PWMA1 比较 捕获
//  PWMA_IER |= 1<<2; PWMA1 比较 捕获
//  PWMA_IER |= 1<<3; PWMA1 比较 捕获
//  PWMA_IER |= 1<<4; PWMA1 比较 捕获PWMA_BKR |= 0x80; // 使能总输出PWMA_CR1 |= 0x01; // 开始计数P_SW2 &= 0x7f;
}
void Forward()
{AIN1 = 0;AIN2 = 1;BIN1 = 0;BIN2 = 1;
}
void Backward()
{AIN1=1;AIN2=0;BIN1=1;BIN2=0;
}
void PWM1_Duty_Update(unsigned int cmp)
{P_SW2 |= 0x80;if(cmp > 0.95 * TBPRD)cmp = 0.95 * TBPRD;else if(cmp < 0.05 * TBPRD)cmp = 0.05 * TBPRD;PWMA_CCR1H = ((unsigned int)cmp >> 8); //设置占空比时间PWMA_CCR1L = ((unsigned int)cmp);P_SW2 &= 0x7f;
}
void PWM2_Duty_Update(unsigned int cmp)
{   P_SW2 |= 0x80;if(cmp > 0.95 * TBPRD)cmp = 0.95 * TBPRD;else if(cmp < 0.05 * TBPRD)cmp = 0.05 * TBPRD;PWMA_CCR2H = ((unsigned int)cmp >> 8); //设置占空比时间PWMA_CCR2L = ((unsigned int)cmp);P_SW2 &= 0x7f;
}
void PWM3_Duty_Update(unsigned int cmp)
{P_SW2 |= 0x80;if(cmp > 0.95 * TBPRD)cmp = 0.95 * TBPRD;else if(cmp < 0.05 * TBPRD)cmp = 0.05 * TBPRD;PWMA_CCR3H = ((unsigned int)cmp >> 8); //设置占空比时间PWMA_CCR3L = ((unsigned int)cmp);P_SW2 &= 0x7f;
}
void PWM4_Duty_Update(unsigned int cmp)
{   P_SW2 |= 0x80;if(cmp > 0.95 * TBPRD)cmp = 0.95 * TBPRD;else if(cmp < 0.05 * TBPRD)cmp = 0.05 * TBPRD;PWMA_CCR4H = ((unsigned int)cmp >> 8); //设置占空比时间PWMA_CCR4L = ((unsigned int)cmp);P_SW2 &= 0x7f;
}
void PWMA_Routine(void) interrupt 7
{static int i=0;static int j=0;i++;if(i>=2000){i=0;j++;if(j==500){j=0;}}
}

编写pwm.h文件

#ifndef _PWM_H_
#define _PWM_H_#define AIN1 P05
#define AIN2 P07
#define BIN1 P03
#define BIN2 P02#define PreScale 24 // 对主频进行的分频系数
#define TBPRD  100// 时基模块的计数值,决定开关周期// PWMA各个通道的端口选择
#define PWM1_0      0x00    //P:P1.0  N:P1.1
#define PWM1_1      0x01    //P:P2.0  N:P2.1
#define PWM1_2      0x02    //P:P6.0  N:P6.1#define PWM2_0      0x00    //P:P5.4  N:P1.3
#define PWM2_1      0x04    //P:P2.2  N:P2.3
#define PWM2_2      0x08    //P:P6.2  N:P6.3#define PWM3_0      0x00    //P:P1.4  N:P1.5
#define PWM3_1      0x10    //P:P2.4  N:P2.5
#define PWM3_2      0x20    //P:P6.4  N:P6.5#define PWM4_0      0x00    //P:P1.6  N:P1.7
#define PWM4_1      0x40    //P:P2.6  N:P2.7
#define PWM4_2      0x80    //P:P6.6  N:P6.7
#define PWM4_3      0xC0    //P:P3.4  N:P3.3// PWM输出端口使能
#define ENO1P       0x01
#define ENO1N       0x02
#define ENO2P       0x04
#define ENO2N       0x08
#define ENO3P       0x10
#define ENO3N       0x20
#define ENO4P       0x40
#define ENO4N       0x80extern int PWM1_Duty;
extern int PWM2_Duty;
extern int PWM3_Duty;
extern int PWM4_Duty;void InitPWMA(void);
void Forward(void);
void Backward(void);
void PWM1_Duty_Update(unsigned int cmp);
void PWM2_Duty_Update(unsigned int cmp);
void PWM3_Duty_Update(unsigned int cmp);
void PWM4_Duty_Update(unsigned int cmp);
//void PWMA_Routine(void) interrupt 7#endif

STC16f40k128——PWM相关推荐

  1. RTT设备与驱动之PWM

    这里将PWM当成一个设备:PWM简介 上图是一个简单的 PWM 原理示意图,假定定时器工作模式为向上计数,当计数值小于阈值时,则输出一种电平状态,比如高电平,当计数值大于阈值时则输出相反的电平状态,比 ...

  2. 51单片机 小车 L298N pwm调速 串口控制 按键控制

    难点:1.串口定时器T1,和T0定时器优先级 2.pwm频率与占空比的设置 按键控制 按键1--前进 按键2--后退 按键3--加速 按键4--减速 (板子上只有四个按键) 串口控制 '1'--前进 ...

  3. 【转载】 stm32之PWM

    发现这位博主的博客被大量的转发,我也转载一篇,谁叫人家写的好呢. 原文地址:http://blog.sina.com.cn/s/blog_49cb42490100s6uh.html 脉冲宽度调制(PW ...

  4. 开关电源三种控制模式:PWM/PFM/PSM

    1. PWM/PFM/PSM 三种控制模式的定义 通常来说﹐开关电源(DC-DC)有三种最常见的调制方式分别为: 脉冲宽度调制(PWM) 脉冲频率调制(PFM) 脉冲跨周期调制(PSM) 在功率集成电 ...

  5. 使用 RPI.GPIO 模块的脉宽调制(PWM)功能

    脉宽调制(PWM)是指用微处理器的数字输出来对模拟电路进行控制,是一种对模拟信号电平进行数字编码的方法.在树莓派上,可以通过对GPIO的编程来实现PWM. 创建一个 PWM 实例: p = GPIO. ...

  6. 树莓派c语言输出pwm波,树莓派硬件PWM输出程序

    一:实验现象 对于树莓派硬件PWM只有1号引脚(wiringPi),单独测试该引脚时,可以输出不同占空比控制led灯成呼吸灯的效果 二:程序步骤 1,初始化wiringPi的库函数; 2,设置对应的P ...

  7. linux pwm控制蜂鸣器 滴滴_兴安盟KOBISHI电磁蜂鸣器BZ-21BLAC24V保证

    兴安盟KOBISHI电磁蜂鸣器BZ-21BLAC24V保证日本KOBISHI蜂鸣器.jjb器 .蜂鸣器BZ-35VR DC24V.济南千斗工业出售,货期短.价格低.保证 这里只对必须用1/2duty的 ...

  8. 全程pwm调光_dc调光的手机有哪些

    dc调光的手机有哪些?目前已经发布的黑鲨游戏手机2.黑鲨游戏手机Helo均为全程DC调光,魅族16系列手机,OPPO的Reno,一加7等手机已经是支持DC调光. dc调光的手机有哪些 1.据悉,目前已 ...

  9. cubemx pwm dma_红米K30S至尊纪念版翻车?被曝虽是LDC屏,却是PWM调光

    ↑↑↑击上方"蓝字"关注,每天推送最新科技新闻 红米发布了自家新款性价比机型红米K30S至尊纪念版,这款产品搭载了高通骁龙865处理器,同时价格仅需2299元,而且还搭载的是LCD ...

最新文章

  1. 他拿着菜刀走进教室,把400个混混送进了一流大学
  2. 【洛谷P1774】最接近神的人
  3. HBase环境搭建60010端口无法访问问题解决方案
  4. java 拆箱 类型不对,Java基本类型于对象类型的拆箱和装箱
  5. 电脑问题勘查 —— BIOS
  6. php 安全处理,php ddos 安全处理代码
  7. 网管IT服务管理五个心得
  8. 程序员确实更容易秃....
  9. 中国移动车联网 V2X 平台白皮书
  10. Windows脚本 同网段ip检测与持续ping包测试
  11. 如何在HTML文档中显示空格
  12. Windows下快速获取一个文件夹下所有文件的名称列表
  13. 预付费水电表系统功能有哪些?
  14. C++中地递增递减运算符和指针
  15. 针对刀具磨损的日志读取的曲线分析(一维高斯滤波及波形拟合)
  16. java开发之经验之谈
  17. ping网络丢包的故障原因
  18. 2000_narrowband to wideband conversion of speech using GMM based transformation
  19. 2021-07-31 Python爬虫练手项目--爬取上千张明星美图
  20. CSDN 论坛板块升级规则

热门文章

  1. 亚马逊跨境卖家选品的主要参考方向—Amazon新手选品指导
  2. EMCC监控_ORACLE
  3. 5大常数是:0,1,π,e,i
  4. PHP之 composer
  5. 2021年中国临床试验管理制度市场趋势报告、技术动态创新及2027年市场预测
  6. 远程集中抄表系统四表合一由武汉七叶研发
  7. 为什么三进制计算机没有商业化?
  8. Apifox接口自动化测试方法
  9. 《炬丰科技-半导体工艺》等离子体的微纳米制造
  10. php.ini 米拓_MetInfo(米拓) v5.1.3任意文件上传漏洞分析附利用EXP | CN-SEC 中文网