235 基于单片机24V直流无刷电机电动车控制器设计

该设计为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

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值