打印
[PIC®/AVR®/dsPIC®产品]

使用Microchip PIC18F4520 MCU实现PWM信号控制电机速度

[复制链接]
1228|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Pulitzer|  楼主 | 2024-10-4 15:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

代码实现
#include <xc.h>

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

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

void PWM_Init(void);
void SetPWM_Duty(unsigned int duty);

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

    PWM_Init(); // 初始化PWM

    while(1) {
        // 增加占空比,电机加速
        SetPWM_Duty(512); // 50%占空比
        __delay_ms(5000); // 维持5秒
        
        // 减少占空比,电机减速
        SetPWM_Duty(256); // 25%占空比
        __delay_ms(5000); // 维持5秒
    }
}

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

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

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

    // 设置初始占空比
    SetPWM_Duty(0);
}

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

代码说明
  • 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的应用教程不多见,感谢分享!

使用特权

评论回复
5
童雨竹| | 2024-10-4 15:55 | 只看该作者
电机控制用L298N这个模块,我也是一样的配置,代码先收藏了。

使用特权

评论回复
6
万图| | 2024-10-4 15:55 | 只看该作者
一直没搞明白占空比设置,这下清楚了,代码写得很详细!

使用特权

评论回复
7
Bblythe| | 2024-10-4 15:55 | 只看该作者
我试了一下这个代码,电机转速调节确实挺平滑的,效果不错!

使用特权

评论回复
8
Wordsworth| | 2024-10-4 15:55 | 只看该作者
有时候PWM控制的响应不太灵敏,你有遇到过类似问题吗?

使用特权

评论回复
9
Uriah| | 2024-10-4 15:56 | 只看该作者
终于找到了个比较简洁的PWM控制例子,教程讲得很清楚,赞!

使用特权

评论回复
10
Clyde011| | 2024-10-4 15:56 | 只看该作者
这代码真省事儿,省得我再去从头配置TMR2和CCP模块了。

使用特权

评论回复
11
l1uyn9b| | 2024-10-23 16:29 | 只看该作者
这怎么看你用的是寄存器呢?没有库函数吗?

使用特权

评论回复
12
g0d5xs| | 2024-10-23 17:37 | 只看该作者
如果使用MCC配置的话,是不是也支持?

使用特权

评论回复
13
ex7s4| | 2024-10-23 18:40 | 只看该作者
时钟和PWM配置用寄存器配置的话,确实麻烦

使用特权

评论回复
14
cen9ce| | 2024-10-23 19:46 | 只看该作者
电机的话要注意电机的转数和占空比之类的啊

使用特权

评论回复
15
b5z1giu| | 2024-10-23 20:48 | 只看该作者
这种只适合配置直流2线制的电机控制

使用特权

评论回复
16
suw12q| | 2024-10-23 21:53 | 只看该作者
如果使用库函数来写的话,是不是更容易理解啊

使用特权

评论回复
17
tax2r6c| | 2024-10-23 22:58 | 只看该作者
还不错,这种主频不高的MCU做电机控制确实合适

使用特权

评论回复
18
lix1yr| | 2024-10-24 08:42 | 只看该作者
看着还行啊,楼主这是不是搞PIC芯片很久了啊

使用特权

评论回复
19
lamanius| | 2024-10-24 09:30 | 只看该作者
电机转数可以通过PWM改变电压来实现呗

使用特权

评论回复
20
su1yirg| | 2024-10-24 12:07 | 只看该作者
这种要是加个按键来控制也是很不错的选择的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

3596

帖子

0

粉丝