PIC单片机的PWM波的简单调制+proteus仿真实现直流电机的启动

本文针对初级单片机学习者,介绍如何使用PIC 16F877A单片机的硬件PWM模块生成PWM波,并通过 Proteus 仿真实现直流电机启动。讲解了相关寄存器配置、计算过程和编程步骤,并提供了仿真结果。
摘要由CSDN通过智能技术生成

前言:该篇文章主要是给刚入门的新人看的,自己也是昨天通过PIC 16F877A调出的一的PWM波。关于什么是PWM波我就不在赘述,这个需要小伙伴自己去查资料了。

主要内容:在这里主要是讲利用PIC单片机自身集成的硬件模块去调PWM波,而不是通过I/O口的模拟。

需要的一些工具:MPLAB X IDE(编程软件) proteus(仿真软件) 芯片手册。

1.我们需要了解的下图的意思。

从图可以看出,在TMR2与CCPRxH比较时,是用来复位的,意思是在计数值等于CCPxH时复位,(用来确定脉冲的宽度)。

在TMR2与PR2比较时,是用来置位,意思是在计数等于PR2时置位,也是将TMR2计数寄存器清零,并且反转CCPxpin的电平。完成一个周期的PWM波的产生。

2.寄存器的介绍(自己使用过的,剩下需要自己去看芯片手册)

CCP1CON:

前两位设置位零即可,bit5,4是PIC 16f877a 10位分辨率的低两位。这个需要你根据你自己相应的PWM来取值。剩下四位,设置1100.

CCPR1L:

该寄存器,是10位分辨率的高8位,同样这个需要你根据你自己

1 载波形为正弦,频率100kHz~500kHz可调节。 2 调制信号由高频信号发生芯片ICL8038实现,设计拨码开关实现,三角,正弦的切换,调制信号可调频率范围500Hz~5kHz。正弦(Vpp>1V)、方(Vpp<5V)、三角(Vpp<6V)。 3 调幅系数可调,范围0~1可调。 模块介绍: 1.调幅信号发送器分三部分组成: ICL8038 信号产生部分、 NE555 载产生部分、 MC1496 信号调制部分。 2.ICL8038仿真电路部分, 有输出信号占空比调节、 频率调节( 范围大于 500-5K)、 两个正弦失真度调节、 输出信号幅度调节( 调节这里的幅度即改变了调幅度)。 3.载部分, 为 NE555 定时器产生 100K-500K 的方信号, 然后通过一个一阶RC 高通滤和一个二阶 LC 低通滤得到交流正弦 4.MC1496部分,包含一个平衡电位器,调节输出调制的幅度 系统框图: ICL8038的仿真图: NE555载产生电路: 2N2222搭建MC1496调制电路: 测试: 测试前应该先拔掉跳帽,接通电源,测ICL8038跳帽输出端调节频率调节电位器调到所要频率(500-5K),可以切换拨码开关选择不同波形,调节ICL8038输出信号的幅度就改变了调幅度。 NE555部分,可以调节电位器改变载信号频率,调节NE555部分的调幅电位器将幅度调到500mV左右。 把两个跳帽接上,因为我们已将平衡电位器调好,所用直接测试输出端即可看到调制输出波形。 中间遇到几个问题,就是频率无法达到500k然后将两个5.1k的电阻改为了2.2k,达到了那个频率要求。
以下是一个简单的计算器C语言程序,使用51单片机实现,同时还包括Proteus仿真。注意,这只是一个简单的示例,仅供参考。您可以根据自己的需求和具体情况进行修改和优化。 ``` #include <reg51.h> // 定义按键端口 sbit key1 = P3^0; sbit key2 = P3^1; sbit key3 = P3^2; sbit key4 = P3^3; sbit key5 = P3^4; sbit key6 = P3^5; sbit key7 = P3^6; sbit key8 = P3^7; // 定义LED端口 sbit led1 = P2^0; sbit led2 = P2^1; sbit led3 = P2^2; sbit led4 = P2^3; sbit led5 = P2^4; sbit led6 = P2^5; sbit led7 = P2^6; sbit led8 = P2^7; // 定义计算器变量 unsigned char num1, num2, op, result; // 定义函数 void delay(unsigned int time); void init(); void compute(); void main() { init(); while(1) { // 判断按键 if(key1 == 0) { num1 = 1; led1 = 1; delay(50); led1 = 0; while(key1 == 0); } if(key2 == 0) { num1 = 2; led2 = 1; delay(50); led2 = 0; while(key2 == 0); } if(key3 == 0) { num1 = 3; led3 = 1; delay(50); led3 = 0; while(key3 == 0); } if(key4 == 0) { op = '+'; led4 = 1; delay(50); led4 = 0; while(key4 == 0); } if(key5 == 0) { num2 = 4; led5 = 1; delay(50); led5 = 0; while(key5 == 0); } if(key6 == 0) { num2 = 5; led6 = 1; delay(50); led6 = 0; while(key6 == 0); } if(key7 == 0) { num2 = 6; led7 = 1; delay(50); led7 = 0; while(key7 == 0); } if(key8 == 0) { compute(); led8 = 1; delay(50); led8 = 0; while(key8 == 0); } } } void delay(unsigned int time) { unsigned int i, j; for(i=0; i<time; i++) { for(j=0; j<120; j++); } } void init() { num1 = 0; num2 = 0; op = 0; result = 0; led1 = 0; led2 = 0; led3 = 0; led4 = 0; led5 = 0; led6 = 0; led7 = 0; led8 = 0; } void compute() { switch(op) { case '+': result = num1 + num2; break; case '-': result = num1 - num2; break; case '*': result = num1 * num2; break; case '/': result = num1 / num2; break; default: result = 0; break; } num1 = result; num2 = 0; op = 0; } ``` 在Proteus中,可以创建一个51单片机电路,并将其与上面的C语言程序进行连接。您可以使用仿真按钮进行仿真和测试。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值