STC16f40k128——PWM
文章目录
- 前言
- 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相关推荐
- RTT设备与驱动之PWM
这里将PWM当成一个设备:PWM简介 上图是一个简单的 PWM 原理示意图,假定定时器工作模式为向上计数,当计数值小于阈值时,则输出一种电平状态,比如高电平,当计数值大于阈值时则输出相反的电平状态,比 ...
- 51单片机 小车 L298N pwm调速 串口控制 按键控制
难点:1.串口定时器T1,和T0定时器优先级 2.pwm频率与占空比的设置 按键控制 按键1--前进 按键2--后退 按键3--加速 按键4--减速 (板子上只有四个按键) 串口控制 '1'--前进 ...
- 【转载】 stm32之PWM
发现这位博主的博客被大量的转发,我也转载一篇,谁叫人家写的好呢. 原文地址:http://blog.sina.com.cn/s/blog_49cb42490100s6uh.html 脉冲宽度调制(PW ...
- 开关电源三种控制模式:PWM/PFM/PSM
1. PWM/PFM/PSM 三种控制模式的定义 通常来说﹐开关电源(DC-DC)有三种最常见的调制方式分别为: 脉冲宽度调制(PWM) 脉冲频率调制(PFM) 脉冲跨周期调制(PSM) 在功率集成电 ...
- 使用 RPI.GPIO 模块的脉宽调制(PWM)功能
脉宽调制(PWM)是指用微处理器的数字输出来对模拟电路进行控制,是一种对模拟信号电平进行数字编码的方法.在树莓派上,可以通过对GPIO的编程来实现PWM. 创建一个 PWM 实例: p = GPIO. ...
- 树莓派c语言输出pwm波,树莓派硬件PWM输出程序
一:实验现象 对于树莓派硬件PWM只有1号引脚(wiringPi),单独测试该引脚时,可以输出不同占空比控制led灯成呼吸灯的效果 二:程序步骤 1,初始化wiringPi的库函数; 2,设置对应的P ...
- linux pwm控制蜂鸣器 滴滴_兴安盟KOBISHI电磁蜂鸣器BZ-21BLAC24V保证
兴安盟KOBISHI电磁蜂鸣器BZ-21BLAC24V保证日本KOBISHI蜂鸣器.jjb器 .蜂鸣器BZ-35VR DC24V.济南千斗工业出售,货期短.价格低.保证 这里只对必须用1/2duty的 ...
- 全程pwm调光_dc调光的手机有哪些
dc调光的手机有哪些?目前已经发布的黑鲨游戏手机2.黑鲨游戏手机Helo均为全程DC调光,魅族16系列手机,OPPO的Reno,一加7等手机已经是支持DC调光. dc调光的手机有哪些 1.据悉,目前已 ...
- cubemx pwm dma_红米K30S至尊纪念版翻车?被曝虽是LDC屏,却是PWM调光
↑↑↑击上方"蓝字"关注,每天推送最新科技新闻 红米发布了自家新款性价比机型红米K30S至尊纪念版,这款产品搭载了高通骁龙865处理器,同时价格仅需2299元,而且还搭载的是LCD ...
最新文章
- 他拿着菜刀走进教室,把400个混混送进了一流大学
- 【洛谷P1774】最接近神的人
- HBase环境搭建60010端口无法访问问题解决方案
- java 拆箱 类型不对,Java基本类型于对象类型的拆箱和装箱
- 电脑问题勘查 —— BIOS
- php 安全处理,php ddos 安全处理代码
- 网管IT服务管理五个心得
- 程序员确实更容易秃....
- 中国移动车联网 V2X 平台白皮书
- Windows脚本 同网段ip检测与持续ping包测试
- 如何在HTML文档中显示空格
- Windows下快速获取一个文件夹下所有文件的名称列表
- 预付费水电表系统功能有哪些?
- C++中地递增递减运算符和指针
- 针对刀具磨损的日志读取的曲线分析(一维高斯滤波及波形拟合)
- java开发之经验之谈
- ping网络丢包的故障原因
- 2000_narrowband to wideband conversion of speech using GMM based transformation
- 2021-07-31 Python爬虫练手项目--爬取上千张明星美图
- CSDN 论坛板块升级规则
热门文章
- 亚马逊跨境卖家选品的主要参考方向—Amazon新手选品指导
- EMCC监控_ORACLE
- 5大常数是:0,1,π,e,i
- PHP之 composer
- 2021年中国临床试验管理制度市场趋势报告、技术动态创新及2027年市场预测
- 远程集中抄表系统四表合一由武汉七叶研发
- 为什么三进制计算机没有商业化?
- Apifox接口自动化测试方法
- 《炬丰科技-半导体工艺》等离子体的微纳米制造
- php.ini 米拓_MetInfo(米拓) v5.1.3任意文件上传漏洞分析附利用EXP | CN-SEC 中文网