wwwmmg 2022-05-15 17:12 采纳率: 100%
浏览 93
已结题

直流电机pwm调速该怎么做

初学,写了个开关电机的代码,网上的pwm代码都没看太懂
想用按键K1通过调pwm控制电机,不转,50%转速,全速三种状态切换,应该怎么做,最好能有代码

img


#include <reg52.h>
#include <intrins.h>

#define uchar unsigned char //无符号字符型 宏定义 变量范围0255
#define uint unsigned int //无符号整型 宏定义 变量范围0
65535

sbit K1=P1^2; // 按键端口

sbit PWM=P3^6; //PWM端口

//延时函数
void delay(uint x)
{
uchar t;
while(x--)
{
for(t=120;t>0;t--);
}
}

void pwm()
{

if(K1==0) //
{
delay(20);
while(K1==0)
{
PWM=~PWM;

}                         

}

}
void main() //主函数
{
while(1)
{
pwm();
}

}

  • 写回答

2条回答 默认 最新

  • 0x33 2022-05-15 18:22
    关注
    
    #include <reg52.h>
    #include <intrins.h>
    #define uchar unsigned char
    #define uint unsigned int
    sbit K1=P1^2;
    sbit PWM=P3^6;
    uchar flag=0;    //定义一个变量,用来记录按键控制pwm的三种状态 0时电机全速 1时电机半速 2时电机不转
    
    void delay(uint x)
    {
        uchar t;
        while(x--)
        {
            for(t=120;t>0;t--);
        }
    }
    
    void pwm()
    {
        if(flag==0)    //flag状态为0时 pwm全为高 电机全速转
            PWM=1;
        else if(flag==1)    //flag状态为1时 pwm占空比为50% 电机半速
        {
            PWM=0;
            delay(100);
            PWM=1;
            delay(100);
        }
        else    //剩下一种可能flag为2 pwm全为低 电机不转
            PWM=0;
    }
    
    void key()
    {
        if(K1==0)     //当检测到按键按下时
        {
            delay(20);        //延时用来消抖
            if(K1==0)    //20ms后K1还为低 证明按键确实按下
            {
                flag++;     //状态值加一
                if(flag>2)    //因为状态只有0、1、2三种可能 所以当状态大于2时要重新赋值为0 以此循环
                    flag=0;
                while(K1==0);    //等待按键松开
            }
        }
    }
    
    void main()
    {
        while(1)
        {
            key();
            pwm();
        }
    }
    

    这是一种比较简单的实现方法 在楼主原来的基础上做了一些修改 首先想跟楼主说的是 建议养成好习惯 将各个模块分离开来 例如把按键部分和pwm部分分开 这样在以后维护代码比较多的工程时比较方便 二是不知道楼主学没学中断 学了中断的话用中断可能会更好 单片机在驱动pwm的同时还要扫描按键 可能会造成占空比不太标准 但由于按键扫描部分执行很快 一般问题不是很大 三是由于不知道楼主仿真时设置的主频是多少 因此延时部分数值随便填写的 常用的按键消抖部分一般为20ms左右 由于电动机可以看做感性器件 所以具体的频率一般需要考虑电动机的感抗和响应速度综合决定 具体的楼主可以去搜一下 确定一个具体的数值 最后有不懂的地方欢迎继续提问 我也是一个小白 跟楼主一起学习 共同进步

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月23日
  • 已采纳回答 5月15日
  • 创建了问题 5月15日

悬赏问题

  • ¥15 MATLAB怎么通过柱坐标变换画开口是圆形的旋转抛物面?
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥30 用arduino开发esp32控制ps2手柄一直报错
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题