找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1007|回复: 5
收起左侧

通过MCU串口发送调试直流电机的占空比,接受完数据后,电机停止转动,大佬帮分析一下

[复制链接]
ID:1027942 发表于 2022-6-23 11:22 | 显示全部楼层 |阅读模式
  1. #include <STC12C5A60S2.H>
  2. #include <intrins.h>
  3. #include <stdio.h>
  4. #include <math.h>
  5. sbit IN1=P1^0;
  6. sbit IN2=P1^1;
  7. sbit ENA=P1^2;  //直流电机的端口定义
  8. unsigned int Counter=0,compare,median;//定时器中断,占空比,接收串口发送的数据
  9. unsigned int s;

  10. void UartInit(void)                //9600bps@11.0592MHz
  11. {
  12.                 SCON  = 0x50;                                 
  13.     TMOD |= 0x20;      
  14.     TH1   = 0xFD;       //   
  15.     TR1   = 1;         
  16.     EA    = 1;
复制代码


回复

使用道具 举报

ID:1027942 发表于 2022-6-23 12:16 | 显示全部楼层
void UartInit(void)                //9600bps@11.0592MHz
{
                SCON  = 0x50;                           
    TMOD |= 0x20;      
    TH1   = 0xFD;      
    TR1   = 1;      
    EA    = 1;      
}
unsigned char GetChar(void)         
{
    while(!RI);
    RI = 0;
    return SBUF;                //        
}
void SendByte(unsigned char dat)
{
    SBUF = dat;
    while(!TI);
    TI = 0;
}

unsigned char zhuanhuang(unsigned char a)
{
                s = a - '0';
        return s;
}

void Timer0Init(void)   
{
        AUXR |= 0x80;   
        TMOD &= 0xF0;  
        TL0 = 0xAE;   
        TH0 = 0xFB;   
        TF0 = 0;     
        TR0 = 1;   
        ET0=1;
        EA=1;
}


void main()
{
        UartInit();
        Timer0Init();
        compare = 10;  
        while(1)
        {
                IN1=1;   
                IN2=0;
                ENA=~ENA;
                median = GetChar();
                compare=zhuanhuang(median);
                SendByte(compare);
        }
}

void Timer0_Routine() interrupt 1
{
                TL0 = 0xAE;      
                TH0 = 0xFB;        
                Counter++;
        if (Counter>=100)                Counter = 0;
                if (Counter >compare)
                {        
                                IN1=0;
                                IN2=0;
                }
}
回复

使用道具 举报

ID:248705 发表于 2022-6-23 13:59 | 显示全部楼层
captaine 发表于 2022-6-23 12:16
void UartInit(void)                //9600bps@11.0592MHz
{
                SCON  = 0x50;                                // SCON:

有点乱,只是想模拟pwm控制电机吗
回复

使用道具 举报

ID:844772 发表于 2022-6-23 16:10 | 显示全部楼层
1、应该用ENA注入pwm; 删除 ENA=~ENA; 再把中断这句改成
  if (Counter >compare)
       ENA=1;
      else
           ENA=0;
2、 还有一句改一下 SendByte(compare+'0');
回复

使用道具 举报

ID:161164 发表于 2022-6-23 16:15 | 显示全部楼层
ENA=~ENA;是干啥的?
while(!RI);死循环了
回复

使用道具 举报

ID:1027942 发表于 2022-6-24 10:33 | 显示全部楼层
用串口控制pwm转速。
ENA在定时中断里面,发送数据后,电机没有反应,保持原来的转速。但是数据过于小,电机就会停止转动。
ENA是控制PWM的,使能端,while(!RI); 是接收串口发送过来的数据,是我在例程里面复制过来的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表