用编码器电机 驱动小车
利用pwm7 8控制一个编码器电机 pwm5 6再控制一个编码器电机 pwm1 2 3 4 选编码器模式 为什么上电都不转呢是哪里配置错了吗看了一下比较复杂,暂时没有带编码器电机之类的实物无法测试,建议先调通底层,先直接写IO口驱动电机,检查硬件有无故障,然后配置好PWM,直接给PWM值让PWM输出信号驱动电机,检查PWM配置是否正常,然后再加入编码器和PID整体调试 要一步步来,先可以控制电机转动、调速,再调试编码器,然后才是PID之类。 DebugLab 发表于 2024-7-19 10:36
看了一下比较复杂,暂时没有带编码器电机之类的实物无法测试,建议先调通底层,先直接写IO口驱动电机,检查 ...
好的 谢谢 梁工 发表于 2024-7-19 10:42
要一步步来,先可以控制电机转动、调速,再调试编码器,然后才是PID之类。 ...
好的谢谢 本帖最后由 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]