#include <STC15F2K60S2.H>
#include <intrins.h>
//PWM频率 = PCA时钟输入源频率/256
//我们需要的PCA时钟输入频率为:PCA时钟输入源频率*256=PWM频率
//现在问题就是 ,我们怎么把12MHZ,转化为PWM频率, 12000KHZ/PCA时钟输入源频率*256=定时器次数,
//这个定时器次数就是分频基数,而这个分频基数由我们的定时器T0的溢出参数来设定,
//意思就是当我们定时器如果计数46.875溢出就可以做到分频基数为46.875,
//定时器0的计数起始值就是65536-分频基数,对应TH0,TL0
void T0_PCA_PWM_Init(void)
{
AUXR |= 0x80; // 定时器0为1T模式 // T0作为PCA时钟源分频基数的设置
TMOD &= 0xF0; // 设置定时器为模式0(16位自动重装载)
TL0 = 0xD1; // 初始值设置 默认1k
TH0 = 0XFF;
TR0 = 0; // 定时器0停止计时
// 8位PWM输出方式
CMOD=0x84; // PCA时钟源选择T0溢出信号,禁止PCA计数器溢出时中断
CCON=0; // 清零PCA计数器溢出中断请求标志位CF
// CR = 0, 不允许 PCA 计数器计数,清零PCA 各模块中断请求标志位CCFn
CL=0; // 清零PCA 计数器
CH=0;
CCAPM2=0x42; // 设置PCA模块2捕获比较寄存器
PCA_PWM2=0; // 设置8位PWM
CCAP2H=0;
EA=1; // 开整个单片机所有中断共享的总中断控制位
CR=0; // 停止PCA计数器(CH,CL)计数
CCAP2H =127; // 占空比设置50%(0-256对应0-100)
CR=1; // 启动PCA计数器(CH,CL)计数
TR0 = 1; // 定时器0开始计时
}
void PWM_FREQ(unsigned int freq)//100~1000Hz(其他的没怎么试过,因为分频系数有些误差)所以
{
unsigned int TimeDate;
unsigned char TimeDate_H,TimeDate_L;
TimeDate=65536-(12000000/(freq*256));
TimeDate_L=(unsigned char)((TimeDate)&0xff);
TimeDate_H=(unsigned char)((TimeDate>>8)&0xff);
TL0 = TimeDate_L; // 初始值设置 默认1k
TH0 = TimeDate_H;
}
void main(void)
{
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
P6M0 = 0x00;
P6M1 = 0x00;
P7M0 = 0x00;
P7M1 = 0x00;
T0_PCA_PWM_Init();
PWM_FREQ(100);
while(1);
}
PCA_PWM_T0输出频率及占空比都可调PWM.zip
需积分: 50 18 浏览量
2019-08-04
17:16:58
上传
评论 2
收藏 45KB ZIP 举报
Technological
- 粉丝: 5
- 资源: 7
最新资源
- 什么是移动应用开发-关于移动应用开发的相关介绍
- 第二组汇报 PPT.pptx
- 什么是大数据开发-相关介绍-关于大数据开发的相关介绍
- 什么是软件测试-相关介绍-关于软件测试的相关介绍
- 前端开发-什么是前端开发-关于前端开发的一些相关介绍
- Sora AI-关于文生视频的使用场景说明
- suno AI文生视频的相关教程和介绍使用
- 什么是后端开发-关于后端开发的一些小介绍分享
- Jurassic Pack Vol. II Dinosaurs 侏罗纪包卷恐龙二号Unity游戏模型资源unitypackage
- Jurassic Pack Vol. III Dinosaurs 侏罗纪包卷恐龙三号Unity游戏模型资源unitypackag
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈