该设计为24V 有感无刷电机直流电机控制器电路板设计,电路采用单片机STC12C5A60S2,IR公司生产的IR2104作为驱动电路的驱动芯片。霍尔为0°、60°、120°,功率变换电路采用6个N道沟场效应管设计低速电动汽车控制器。该24V低速电动车直流无刷电机控制器根据检测到的霍尔位置信号,通过驱动电路控制功率变换电路中的6个N道沟场效应管,使其两两导通,进而实现换相,驱动低速电动汽车无刷电机转动。该24V低速电动车直流无刷电机控制器有电压电流检测电路,可实现电路保护。除此之外,该控制器可以通过按键实现低速电动汽车的加速、减速和停止。通过实验验证,该低速电动汽车直流无刷电机运行稳定。
完整版 电路图和程序代码 下载地址
https://pan.baidu.com/s/1GD3YGLR60sHxBwVgHXL9mA?pwd=8888
部分代码展示
/*******************************************/
// 24V 有感无刷电机
// 单片机STC12C5A60S2,晶振12M
// 霍尔为0°、60°、120°
/*******************************************/
#include <STC12C5A60S2.H>
#include <intrins.h> /*use _nop_() function*/
#define uchar unsigned char
#define uint unsigned int
#define ADC_FLAG 0X10
sbit HALL_A = P3^7; //霍尔传感器
sbit HALL_B = P3^6;
sbit HALL_C = P3^5;
sbit SD_A = P1^7; //PWM控制位
sbit SD_B = P1^6;
sbit SD_C = P1^5;
sbit IN_A = P3^4; //高低电平控制位
sbit IN_B = P3^3;
sbit IN_C = P3^2;
sbit P10 = P1^0; //电流检测
sbit P11 = P1^1; //电压检测
sbit PWM = P1^3;
sbit key1 = P2^1; //ok
sbit key2 = P2^2; //+
sbit key3 = P2^3; //-
sbit LED = P2^0;
char LED_flag = 0;
uchar Temp;
uchar PWM_temp=0x80; //当前PWM数值
uchar Speed_Seting=15; //速度设定 上限20
uchar last_key; //按键变量
uint Times=0;Times1=0;Times2=0;
uchar speed1=0,speed2=0;
uint I,U;
bit speed_mark;
bit ZF=1; //1为正转,0为反转
bit K=1;
void delay();
void key_scan();
void Key_1_();
void Key_2_();
void Key_3_();
void init_pwm();
void ad_pwm();
void InitTimer0();
void InitADC();
uint filter(uchar ch);
/**************************************
1602液晶
**************************************/
sbit RS = P2^5;
sbit RW = P2^6;
sbit E = P2^7;
/**************************************
短延时
**************************************/
void delay5ms()
{
uchar i,v,k;
for(i=1;i>0;i--)
for(v=168;v>0;v--)
for(k=22;k>0;k--);
}
/**************************************
写指令
**************************************/
void lcd_Write_com(uchar com)
{
RS=0; //定义指令寄存器
RW=0; //写允许
P0=com; //写指令
delay5ms(); E=1; //片选端上拉
delay5ms(); E=0; //下降沿锁存
}
/**************************************
写数据
**************************************/
void lcd_write_date(uchar date)
{
RS=1; //定义数据寄存器
RW=0; //写允许
P0=date; //写数据
delay5ms(); E=1; //片选端上拉
delay5ms(); E=0; //下降沿锁存
}
/**************************************
显示程序
**************************************/
void dis_lcd1602(uchar x,uchar y,uchar dat)
{
uchar add;
if(y==1) add=(0x80+x);
if(y==2) add=(0xc0+x);
lcd_Write_com(add); //写指令
lcd_write_date(dat); //写数据
}
/**************************************
液晶初始化
**************************************/
void lcd1602_init()
{
lcd_Write_com(0x38); //设置8位格式,2行,5*7
lcd_Write_com(0x01); //清屏
lcd_Write_com(0x0c); //整体显示,关光标,不闪烁
lcd_Write_com(0x06); //设定输入方式,增量不移位
lcd_Write_com(0x80); //初始坐标
}
/**************************************
液晶显示汉字程序
**************************************/
void hz_lcdDis(uchar x,uchar y,uchar *p) //汉字显示
{
uchar i=0,temp;
if(x)temp = 0x40; else temp = 0;
for(i=y;*p!='\0';i++,p++)
{
lcd_Write_com(i|0x80+temp);
lcd_write_date(*p);
delay5ms();
}
}
/**************************************
液晶显示数字程序
**************************************/
void num_lcdDis(uchar X,uchar Y,uint num,uchar n)
{
uint i=0,temp,hang;
n +=1;
if(X)hang = 0x40;else hang = 0;
for(i=(n-1);i>0;i--)
{
lcd_Write_com((i+Y-1)|0x80+hang); //从个位开始显示
temp = num%10+0x30;
lcd_write_date(temp);
delay5ms();
num/=10;
}
}
/**********************************************************
函数说明: 延时程序
**********************************************************/
void delay(uchar t)
{
uint j;
uchar i;
for(i=0;i<t;i++)
for(j=0;j<1000;j++);
}
/**********************************************************
函数说明:按键延时防抖动
P2^1 Key_1
P2^2 Key_2
P2^3 Key_3
**********************************************************/
void key_scan()
{
uchar temp;
temp = P2&0x1F;
if(last_key != temp)
{
delay(10);
temp = P2&0x1F;
if(temp!= 0x1F)
{
switch(temp)
{
case 0x1D: Key_1_(); break; //21
case 0x1B: Key_2_(); break; //22
case 0x17: Key_3_(); break; //23
default:break;
}
}
}
last_key = temp;
}
/**********************************************************
函数说明: +按键程序
Speed_Seting 20
**********************************************************/
void Key_1_()
{
Speed_Seting++;
if(Speed_Seting>19)Speed_Seting=19;
if(Speed_Seting>9)
{
ZF=1;//正转
PWM_temp=255-(Speed_Seting-10)*25;
CCAP0H = CCAP0L =PWM_temp;
}
else