[PIC®/AVR®/dsPIC®产品] 使用Microchip PIC18F4520 MCU实现PWM信号控制电机速度

[复制链接]
3740|23
 楼主| Pulitzer 发表于 2024-10-4 15:53 | 显示全部楼层 |阅读模式

在这个帖子中,我将分享如何使用Microchip PIC18F4520单片机来生成PWM信号并控制直流电机的速度。PWM信号非常适合用于电机控制、LED调光等应用场景。这次我们主要通过调整PWM占空比来控制电机的转速。

硬件说明
本次项目使用PIC18F4520 MCU,搭配L298N电机驱动模块来控制直流电机。通过MCU产生的PWM信号,调整直流电机的转速。

代码实现
  1. #include <xc.h>

  2. #define _XTAL_FREQ 20000000 // 定义主时钟频率为20MHz

  3. // 配置字
  4. #pragma config OSC = HS, WDT = OFF, PWRT = OFF, BOREN = ON, LVP = OFF, CPD = OFF

  5. void PWM_Init(void);
  6. void SetPWM_Duty(unsigned int duty);

  7. void main() {
  8.     TRISC2 = 0; // 设置CCP1引脚为输出

  9.     PWM_Init(); // 初始化PWM

  10.     while(1) {
  11.         // 增加占空比,电机加速
  12.         SetPWM_Duty(512); // 50%占空比
  13.         __delay_ms(5000); // 维持5秒
  14.         
  15.         // 减少占空比,电机减速
  16.         SetPWM_Duty(256); // 25%占空比
  17.         __delay_ms(5000); // 维持5秒
  18.     }
  19. }

  20. // PWM初始化函数
  21. void PWM_Init(void) {
  22.     PR2 = 0xFF; // 设置PWM周期

  23.     // 配置TMR2预分频器
  24.     T2CONbits.T2CKPS = 0x01; // 设置预分频器为1:4
  25.     T2CONbits.TMR2ON = 1;    // 启动TMR2

  26.     // 配置CCP1模块为PWM模式
  27.     CCP1CONbits.CCP1M = 0x0C;

  28.     // 设置初始占空比
  29.     SetPWM_Duty(0);
  30. }

  31. // 设置PWM占空比
  32. void SetPWM_Duty(unsigned int duty) {
  33.     if(duty < 1024) {
  34.         CCP1CONbits.DC1B = duty & 0x03;   // 设置占空比的低2位
  35.         CCPR1L = duty >> 2;               // 设置占空比的高8位
  36.     }
  37. }

代码说明
  • PWM_Init():此函数配置TMR2计时器,并将CCP1模块设置为PWM模式。它负责初始化PWM信号,确保计时器2的预分频器和周期寄存器设置正确。
  • SetPWM_Duty():设置PWM信号的占空比,用于控制电机的转速。占空比可以通过传递的参数进行调节,范围为0到1023,对应0%到100%的占空比。
  • 主循环:简单地在25%和50%的占空比之间切换,以不同速度控制电机,模拟加速和减速的过程。

总结
通过这段代码,我们成功实现了使用Microchip的PIC18F4520生成PWM信号,并通过调整PWM的占空比来控制电机的转速。这是电机控制中的常见手段,适用于许多需要精确控制电机速度的应用场景。
公羊子丹 发表于 2024-10-4 15:54 | 显示全部楼层
这个代码真不错!正好我也在研究PWM控制电机,拿来试试!
周半梅 发表于 2024-10-4 15:54 | 显示全部楼层
看起来挺简单的,PWM控制还是挺好用的,我也来搞个电机实验。
帛灿灿 发表于 2024-10-4 15:54 | 显示全部楼层
太棒了,PIC18F4520的应用教程不多见,感谢分享!
童雨竹 发表于 2024-10-4 15:55 | 显示全部楼层
电机控制用L298N这个模块,我也是一样的配置,代码先收藏了。
万图 发表于 2024-10-4 15:55 | 显示全部楼层
一直没搞明白占空比设置,这下清楚了,代码写得很详细!
Bblythe 发表于 2024-10-4 15:55 | 显示全部楼层
我试了一下这个代码,电机转速调节确实挺平滑的,效果不错!
Wordsworth 发表于 2024-10-4 15:55 | 显示全部楼层
有时候PWM控制的响应不太灵敏,你有遇到过类似问题吗?
Uriah 发表于 2024-10-4 15:56 | 显示全部楼层
终于找到了个比较简洁的PWM控制例子,教程讲得很清楚,赞!
Clyde011 发表于 2024-10-4 15:56 | 显示全部楼层
这代码真省事儿,省得我再去从头配置TMR2和CCP模块了。
l1uyn9b 发表于 2024-10-23 16:29 | 显示全部楼层
这怎么看你用的是寄存器呢?没有库函数吗?
g0d5xs 发表于 2024-10-23 17:37 | 显示全部楼层
如果使用MCC配置的话,是不是也支持?
ex7s4 发表于 2024-10-23 18:40 | 显示全部楼层
时钟和PWM配置用寄存器配置的话,确实麻烦
cen9ce 发表于 2024-10-23 19:46 | 显示全部楼层
电机的话要注意电机的转数和占空比之类的啊
b5z1giu 发表于 2024-10-23 20:48 | 显示全部楼层
这种只适合配置直流2线制的电机控制
suw12q 发表于 2024-10-23 21:53 | 显示全部楼层
如果使用库函数来写的话,是不是更容易理解啊
tax2r6c 发表于 2024-10-23 22:58 | 显示全部楼层
还不错,这种主频不高的MCU做电机控制确实合适
lix1yr 发表于 2024-10-24 08:42 | 显示全部楼层
看着还行啊,楼主这是不是搞PIC芯片很久了啊
lamanius 发表于 2024-10-24 09:30 | 显示全部楼层
电机转数可以通过PWM改变电压来实现呗
su1yirg 发表于 2024-10-24 12:07 | 显示全部楼层
这种要是加个按键来控制也是很不错的选择的

您需要登录后才可以回帖 登录 | 注册

本版积分规则

170

主题

6176

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部