您好,我研究电机多年!现为您解答:可以这样说,PWM对步进电机几乎没什么太大作用,因为步进电机不像直流电机那样通过改变电压来改变转速,步进电机是有工作时序的,而且步进电机需要驱动电路的,你输入的PWM信号对驱动芯片来说只是个时序信号,最终输出的电压大小还是驱动电路实现的,所以用PWM调节步进电机简直就是画蛇添足,瞎给自己找麻烦!如果想改变步进电机的速度可以通过改变每两个脉冲之间的延时时间来实现。如果想改变步进电机的扭矩可以通过改变步进电机的工作节拍来实现!一般单四拍力矩最小,双四拍力矩最大,半步8拍力矩稍小于双四拍,但是步进分辨率要高一倍!
望采纳,谢谢!
#include <AT89X51H>
#define uchar unsigned char
/
TH0和TL0是计数器0的高8位和低8位计数器,计算办法:TL0=(65536-C)%256;
TH0=(65536-C)/256,其中C为所要计数的次数即多长时间产生一次中断;TMOD是计数器
工作模式选择,0X01表示选用模式1,它有16位计数器,最大计数脉冲为65536,最长时
间为1ms65536=65536ms
/
#define V_TH0 0XFF
#define V_TL0 0XF6
#define V_TMOD 0X01
void init_sys(void); /系统初始化函数/
void Delay5Ms(void);
unsigned char ZKB1,ZKB2;
void main (void)
{
init_sys();
ZKB1=40; /占空比初始值设定/
ZKB2=70; /占空比初始值设定/
while(1)
{
if (!P1_1) //如果按了+键,增加占空比
{
Delay5Ms();
if (!P1_1)
{
ZKB1++;
ZKB2=100-ZKB1;
}
}
if (!P1_2) //如果按了-键,减少占空比
{
Delay5Ms();
if (!P1_2)
{
ZKB1--;
ZKB2=100-ZKB1;
}
}
/对占空比值限定范围/
if (ZKB1>99) ZKB1=1;
if (ZKB1<1) ZKB1=99;
}
}
/
函数功能:对系统进行初始化,包括定时器初始化和变量初始化/
void init_sys(void) /系统初始化函数/
{
/定时器初始化/
TMOD=V_TMOD;
TH0=V_TH0;
TL0=V_TL0;
TR0=1;
ET0=1;
EA=1;
}
//延时
void Delay5Ms(void)
{
unsigned int TempCyc = 1000;
while(TempCyc--);
}
/中断函数/
void timer0(void) interrupt 1 using 2
{
static uchar click='0'; /中断次数计数器变量/
TH0=V_TH0; /恢复定时器初始值/
TL0=V_TL0;
++click;
if (click>=100) click='0';
if (click<=ZKB1) /当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整/
P1_3=0;
else
P1_3=1;
if (click<=ZKB2)
P1_4=0;
else
P1_4=1;
}只是调占空比的,希望对你有帮助,调试好的
用PWM输出引脚驱动驱动晶体管或MOSFET, 以脉宽调制的方法实现直流电机工作电压调节,即调节了电机速度。 一般单片机都有PWM功能,不需要使用定时器,用定时器的方法产生PWM既耗费CPU资源,精确度差,速度慢 CPU忙得满头汗执行中断去产生PWM。 而芯片内部的PWM是硬件逻辑部件,你只需初始化好以后,给它一个数值(控制脉冲占空比)即可自动产生PWM波形。
#include<reg51h>
#define uchar unsigned char
uchar pwm=50,num;
sbit pluse=P1^0;
void t0isr() interrupt 1
{
num++;
num%=10;
if(num<pwm/10)pluse=1;
else pluse=0;
}
main()
{
TMOD=0x02;
TH0=246;
TL0=246;
TR0=1;
ET0=1;
EA=1;
while(1);
}
以上就是关于如何通过PWM控制步进电机全部的内容,包括:如何通过PWM控制步进电机、单片机C语言编程:用PWM控制直流电机转速、用PWM怎么调节直流电机的速度 用两个定时器怎么 写程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)