lsm 发表于 2024-7-19 09:18:16

用编码器电机 驱动小车

利用pwm7 8控制一个编码器电机   pwm5 6再控制一个编码器电机    pwm1 2 3 4 选编码器模式   为什么上电都不转呢是哪里配置错了吗

DebugLab 发表于 2024-7-19 10:36:42

看了一下比较复杂,暂时没有带编码器电机之类的实物无法测试,建议先调通底层,先直接写IO口驱动电机,检查硬件有无故障,然后配置好PWM,直接给PWM值让PWM输出信号驱动电机,检查PWM配置是否正常,然后再加入编码器和PID整体调试

梁工 发表于 2024-7-19 10:42:54

要一步步来,先可以控制电机转动、调速,再调试编码器,然后才是PID之类。

lsm 发表于 2024-7-19 10:49:23

DebugLab 发表于 2024-7-19 10:36
看了一下比较复杂,暂时没有带编码器电机之类的实物无法测试,建议先调通底层,先直接写IO口驱动电机,检查 ...

好的 谢谢

lsm 发表于 2024-7-19 10:49:48

梁工 发表于 2024-7-19 10:42
要一步步来,先可以控制电机转动、调速,再调试编码器,然后才是PID之类。 ...

好的谢谢

zwf33335 发表于 2024-11-4 20:30:32

本帖最后由 zwf33335 于 2024-11-4 20:32 编辑

梁工 发表于 2024-7-19 10:42
要一步步来,先可以控制电机转动、调速,再调试编码器,然后才是PID之类。 ..EC11.EC11编码器函数,很好用
#include <intrins.h>
#include      "STC8Hxxx.h"
#include      "bmq.h"

u16 PWM4_Duty;
sbit Asign=P3^2; // 编码器A脚
sbit Bsign=P3^4; // 编码器B脚
u16 dangwei = 0;
u8 rotate;
u8 disp_xs;

void INT0_init()   //外中断0
{
   IT0 = 1;      //下降沿中断
         EX0 = 1;      //使能中断
         EA = 1;         //开总中断
}

void INT0_Isr()interrupt 0   //外中断服务函数
{

      //if(changan_dj_bmq==0)
      {      
                if(Bsign=!Asign)//A和B电平相反时才可计数
                {
                if(Bsign==1)   //B高电平时间右转
                        {
                                 disp_xs=0;                                                                                       
                              if(rotate<6)      
                              {                                       
                                        rotate++;      
         if(rotate ==1)      
         {         
                                  dangwei = 165;
                                 }
                                 if(rotate ==2)      
         {                                       
                                  dangwei = 330;
                                 }
                                 if(rotate ==3)      
         {                                       
                                  dangwei = 490;
                                 }
                                 if(rotate ==4)      
         {                                       
                                  dangwei = 650;
                                 }
                                  if(rotate ==5)      
         {                                       
                                  dangwei = 800;
                                 }
                                  if(rotate ==6)      
         {                                       
                                  dangwei = 999;
                                 }
                              }
                              if(rotate>6)
                                        rotate=6;
                              if(rotate>0)
                                        {
                                          PWMA_CCER2 = 0x55;   //比较输出使能,见STC8H说明书1161页
            PWMA_ENO |= 0x40;//使能输出 P26      
            PWMA_BKR = 0x80; // 刹车寄存器,关闭输出见STC8H说明书1166页
            PWMA_CR1 |= 0x01; //开始计时                                                
                                        }
                        }//检测B引脚电平
                else
                        if(Bsign==0)    //B低电平时间左转
                              {
                                        disp_xs=0;                                                                        
                                        if(rotate>0)
                                        {
                                          rotate--;
                                                if(rotate ==5)
                                                {
                                                dangwei = 800;
                                                }
                                                if(rotate ==4)
                                                {
                                                dangwei = 650;
                                                }      
                                                if(rotate ==3)
                                                {
                                                dangwei = 490;
                                                }      
                                                if(rotate ==2)
                                                {
                                                dangwei = 330;
                                                }      
                                                if(rotate ==1)
                                                {
                                                dangwei = 160;
                                                }      
                                                if(rotate ==0)
                                                {
                                                dangwei = 0;
                                                }      
                                        }                                                
                                        if(rotate<0)
                                                rotate=0;                                       
                              }
                              while((!Bsign)||(!Asign));//AB若有低电平则进入循环
                              
                                        if(rotate==0)
                                        {
                                          PWMA_CCER2 = 0x00;   //关闭比较输出使能,见STC8H说明书1161页
            PWMA_ENO &= 0x40;//关闭使能输出 P26      
            PWMA_BKR = 0x00; // 刹车寄存器,关闭输出见STC8H说明书1166页
            PWMA_CR1 *= 0x01; //禁止计时                                                
                                        }
               
               
                }
}
}
页: [1]
查看完整版本: 用编码器电机 驱动小车