单片机直流电机调速问题

#include <REGX52.H>
#include "Delay.h"
#include "Nixie.h"
#include "Timer0.h"
#include "Key.h"
 
 sbit Motor=P1^0;
unsigned char Count,Compare;
unsigned char KeyNum,Speed;
void main()
{
    Timer0_Init();
    while(1)
    {
        KeyNum=Key();
        if(KeyNum==1)
        {
            Speed++;
            Speed%=4;
            if(Speed==0){Compare=0;}
            if(Speed==1){Compare=25;}
            if(Speed==2){Compare=50;}
            if(Speed==3){Compare=100;}
        }
        Nixie(1,Speed);
    }
}

void Timer0_Routine() interrupt 1
{
    
    TL0 = 0x9C;
    TH0 = 0xFF;    
    Count++;
        Count%=100;
        if(Count<Compare)
        {
            Motor=0;
        }
        else
        {
            Motor=1;
        
        }
        
    }


为啥我的直流电机不能调速啊 是不是接线问题啊 基本就是启动自己狂转 数码管有显示数字 但是就是控制不了速度。

【以下回答由 GPT 生成】

首先,根据您提供的代码和描述,我注意到您使用了单片机的定时器中断来控制电机的转速。您将Speed的值设置为0、25、50和100,然后在定时器中断中通过比较Count和Compare来切换Motor的状态。这个基本逻辑是正确的,但是您有两个问题可能导致电机无法以期望的速度旋转。

  1. 问题一:定时器计时值的设置不正确。

首先,根据您提供的代码,您使用的是定时器0来控制电机的转速。定时器0是一个8位计数器,它的初值由TH0和TL0寄存器决定。在您的代码中,您将TH0设置为0xFF,这意味着定时器0的计数值从255开始,而不是从0开始。因此,您需要调整定时器的初值设置。如果希望电机旋转速度较慢,请将TH0和TL0的初值设置为合适的值。

例如,如果所选择的晶振频率为12MHz,并且希望定时器每过1ms触发一次中断,则需要设置以下初值:

TH0 = (65536 - (12000/12))/256;  // 65536是2^16
TL0 = (65536 - (12000/12))%256;

这将使定时器计数从0开始,并且每过1ms触发一次中断。

  1. 问题二:电机驱动方式不正确。

在您的代码中,当Count小于Compare时,将Motor设置为0,否则设置为1。这意味着当Count小于Compare时,电机是关闭的,而当Count大于或等于Compare时,电机是打开的。为了让电机旋转,您应当在Count小于Compare时设置Motor为1,否则设置为0。

修改后的代码如下:

void Timer0_Routine() interrupt 1
{
    TL0 = (65536 - (12000/12))%256;
    TH0 = (65536 - (12000/12))/256;
    Count++;
    Count%=100;
    if(Count < Compare)
    {
        Motor=1;
    }
    else
    {
        Motor=0;
    }
}

请尝试根据以上建议进行修改,看看是否能够解决电机无法以期望速度旋转的问题。如果问题仍然存在,请提供更多的信息,例如电机驱动电路、使用的电机型号和其他可能相关的细节,以便进一步调查和解决问题。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^