初学,写了个开关电机的代码,网上的pwm代码都没看太懂
想用按键K1通过调pwm控制电机,不转,50%转速,全速三种状态切换,应该怎么做,最好能有代码
#define uchar unsigned char //无符号字符型 宏定义 变量范围025565535
#define uint unsigned int //无符号整型 宏定义 变量范围0
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();
}
}
#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左右 由于电动机可以看做感性器件 所以具体的频率一般需要考虑电动机的感抗和响应速度综合决定 具体的楼主可以去搜一下 确定一个具体的数值 最后有不懂的地方欢迎继续提问 我也是一个小白 跟楼主一起学习 共同进步
调节占空比!注意输出的pwm频率要满足电机的频率