OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...

查看: 9887|回复: 101

为感谢正点原子,本人公布自制无刷电机设计资料,代码也贴上了。

  [复制链接]

  离线 

6

主题

267

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2349
金钱
2349
注册时间
2016-7-17
在线时间
347 小时
发表于 2017-1-5 18:12:59 | 显示全部楼层 |阅读模式
正点原子公众号
本帖最后由 f1174562 于 2018-1-13 16:33 编辑

本人自2016年开始学习STM32的应用,在此之前只用过51和AVR,也只会汇编语言。初学时同时面对STM32和C语言两个问题,感觉无从下手。在书店买的书感觉也只是把ST公司网上的内容找人翻译出来而已,指导意义不大,所以只好从网上找资料筛选,与此同时先学习C语言。在首先参考一些STM32硬件设计和产品手册后,先初步领会了硬件设计基础,画了无刷电机的电路图。毕竟以以前对单片机的认识,MCU最重要的工作就是选芯片、连管脚和写寄存器。画好图后C语言也基本初学完成了,又开始学习STM32的C语言设计,在此期间我在网上找到了原子先生的STM32手册,这些手册真起了大用。最初我想学库函数,但是学了几天发现C语言基础太差,几乎看不懂库函数,只好转而学习寄存器版,我发现这还是比较容易理解,我感觉操作寄存器也不麻烦。本人学习过程中逐步由浅入深,每次实现一个小目标,循序渐进。开始先控制亮数码管,再使用AD显示输入电压,然后开始BLDC的控制,现在基本可以使用自如了。
为感谢原子先生,本人在此公布我的BLDC控制器的软硬件设计,希望对初学者有用处。欢迎高手提改进意见。本控制器含有6个MOS、5位数码管、1路CAN总线、9个按键、可测电压电流和IIC器件等内容,可选择HALL和无感控制两种工作方式。
代码在6#。有H-on L-pwm 和H-pwm L-on两种方式,开始我用的是L-on,后来改为H-on,H-on的工作做的更细一些,似乎工作效果也比L-on更好一点,L-on有错误,需要改正,有兴趣的可以试试。

有些朋友向我要电路板,现在已经没有了。PCB上有两个错误,MCU8、9脚反了,得自己修,还有晶振搞错了,建议用HSI就别用晶振了。
这个电路板只是个原理实验性质的样件,仅供学习参考,请勿用于商业,如果朋友们发现电路板和程序有什么可以改进提高的地方,请告知我。

PCB图和错误描述见http://www.openedv.com/forum.php ... mp;extra=#pid491504




BLDC.pdf

167.53 KB, 下载次数: 4406

回复

使用道具 举报

  离线 

6

主题

638

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2088
金钱
2088
注册时间
2016-11-30
在线时间
217 小时
发表于 2017-1-5 18:21:17 | 显示全部楼层
顶一下!
回复 支持 反对

使用道具 举报

  离线 

72

主题

6557

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
13057
金钱
13057
注册时间
2013-11-13
在线时间
1495 小时
发表于 2017-1-5 18:42:51 | 显示全部楼层
多谢分享,顶!
开往春天的手扶拖拉机
回复 支持 反对

使用道具 举报

  离线 

1

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2016-12-10
在线时间
13 小时
发表于 2017-1-5 18:55:21 | 显示全部楼层
多谢分享,新手下载学习下
回复 支持 反对

使用道具 举报

  离线 

11

主题

593

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1697
金钱
1697
注册时间
2014-10-6
在线时间
542 小时
发表于 2017-1-6 07:58:07 | 显示全部楼层
正点原子公众号
谢谢分享!
回复 支持 反对

使用道具 举报

  离线 

6

主题

267

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2349
金钱
2349
注册时间
2016-7-17
在线时间
347 小时
 楼主| 发表于 2017-1-6 08:32:30 | 显示全部楼层
[AppleScript] 纯文本查看 复制代码
/*********************************************************************
	GPIOA0-7显示a-dp,PC14=N1,PC15=N2,PB2=N3,PB12=N4,PB9=N5
	1=ON,0=OFF
	使用8MHzHSI,其它频率请自己修改时间设定
*********************************************************************/
#include "stm32f10x.h"
#define H_on						//定义工作方式H-on L-on,否则为H-pwm L-on

/*延时函数**************************************/
void delay(unsigned int i)			//50对应27us,100对应52us,250对应127us,500对应252us,1000对应502us,10000对应5ms,100000对应50ms
{
	for(;i!=0;i--);
}

unsigned int step,cycle,cc[61]={0},rr1=0;

#ifdef H_on
//H-on L-pwm方式***********************************************************************************************************************
void TIM4_IRQHandler(void)					//中断函数中实现延时换相
{	
	unsigned int k,j,zc=0;
	switch(step)							//工作顺序step 23(UW)-11(VW)-33(VU)-21(WU)-13(WV)-31(UV)
		{		
		case 11:k=TIM4->CCR1;for(j=0;j<20;j++){if(GPIOB->IDR&0x0040)zc++;};break;
		case 13:k=TIM4->CCR1;for(j=0;j<20;j++){if(!(GPIOB->IDR&0x0040))zc++;};break;
		case 21:k=TIM4->CCR2;for(j=0;j<20;j++){if(GPIOB->IDR&0x0080)zc++;};break;
		case 23:k=TIM4->CCR2;for(j=0;j<20;j++){if(!(GPIOB->IDR&0x0080))zc++;};break;
		case 31:k=TIM4->CCR3;for(j=0;j<20;j++){if(GPIOB->IDR&0x0100)zc++;};break;
		case 33:k=TIM4->CCR3;for(j=0;j<20;j++){if(!(GPIOB->IDR&0x0100))zc++;};break;
		}

	if(zc>=18)								//连续检测到多次过零为真实过零,否则退出
	{
		if(k>cc[0])							//周期等于两次过零的间隔
			zc=k-cc[0];						//计算过零时间间隔
			else
				zc=65536-cc[0]+k;
		cc[0]=k;							//cc[0]记录本次过零捕获CCR值,准备下次使用		

//PA15、PB3、4、5可用,对应S7、8、9
	j=TIM1->CCR1;							//读当前占空比
	if(!j)									//如果j=0接着读,直到读到有效值
		j=TIM1->CCR2;
		if(!j)
			j=TIM1->CCR3;
	GPIOA->BSRR|=1<<15;							//GPIOA_Pin15置为高电平
	rr1++;
	if(rr1>6)								//对占空比变化速度加以限制
	{	
	if((GPIOB->IDR&1<<3)&&(j<500))
		j++;								//S7键加占空比
	if((GPIOB->IDR&1<<5)&&(j>40))
		j--;								//S9键减占空比
	if(j<40)
		j++;
	rr1=0;
	}
//发生过零捕获后应等待30度再换相,即两次捕获时间间隔的一半
		if(zc<1600)									//过零间隔小于1600(转速高于约300rpm)才延时,否则过零直接换相
			{
				k=zc/2;
				if(k>20)								//k小于等于20不延时
				{
					TIM2->PSC=79;
					TIM2->ARR=k-20;						//延时减去200usRC延迟
					TIM2->CR1=9;						//启动TIM2,单次工作
					while(!TIM2->SR);					//等待溢出
					TIM2->SR=0;							//清除标志
				}				  
			}

		switch(step)				//工作顺序step (UV)23-(UW)11-(VW)33-(VU)21-(WU)13-(WV)31
			{		
			case 11:GPIOA->BRR|=1<<8;GPIOA->BSRR|=1<<9;TIM4->CCER=0x0300;step=33;break;
			case 13:TIM1->CCR1=0;TIM1->CCR2=j;TIM4->CCER=0x0100;step=31;break;
			case 21:GPIOA->BRR|=1<<9;GPIOA->BSRR|=1<<10;TIM4->CCER=0x0003;step=13;break;
			case 23:TIM1->CCR2=0;TIM1->CCR3=j;TIM4->CCER=0x0001;step=11;break;
			case 31:GPIOA->BRR|=1<<10;GPIOA->BSRR|=1<<8;TIM4->CCER=0x0030;step=23;break;
			case 33:TIM1->CCR3=0;TIM1->CCR1=j;TIM4->CCER=0x0010;step=21;break;
			} 

		for(j=1;j<60;j++)					//原过零间隔记录向后移动一次,去除最高位,为新cc[1]留出位置,计算平均转速
			{
				cc[j+1]=cc[j];
			}
		cc[1]=zc;
		cycle=cc[1];
		for(j=2;j<61;j++)
		{
			cycle+=cc[j];
		}
		cycle/=60;
	}
	TIM4->SR=0;
}




#else
//H-pwm L-on方式********************************************************************************************************************
void TIM4_IRQHandler(void)
{	
	unsigned int k;
	switch(step)						//工作顺序step 23(UW)-11(VW)-33(VU)-21(WU)-13(WV)-31(UV)
		{		
		case 11:k=TIM4->CCR1;break;
		case 13:k=TIM4->CCR1;break;
		case 21:k=TIM4->CCR2;break;
		case 23:k=TIM4->CCR2;break;
		case 31:k=TIM4->CCR3;break;
		case 33:k=TIM4->CCR3;break;
		}

	if(k>cc1)							//周期等于两次过零的差值
		cycle=k-cc1;					//计算过零时间间隔
		else
			cycle=65536-cc1+k;
	cc1=k;								//记录本次过零时间
	 
//发生过零捕获后应等待30度再换相,即两次捕获时间间隔的一半
		if(cycle<1600)									//cycle大于等于1600(转速低于300rpm)直接换向,转速高时才延时
			{
				k=cycle/2;
				if(k>20)								//k小于等于20不延时
				{
					TIM2->PSC=79;
					TIM2->ARR=k-20;						//延时减去200usRC延迟
					TIM2->CR1=9;						//启动TIM2,单次工作
					while(!TIM2->SR);					//等待溢出
//					TIM2->CR1=0;						//停止TIM2
//					TIM2->EGR=1;
					TIM2->SR=0;							//清除标志
				}				  
			}

	switch(step)				//工作顺序step 23(UW)-11(VW)-33(VU)-21(WU)-13(WV)-31(UV)
		{		
		case 11:TIM1->CCER&=!1;TIM1->CCER|=1<<4;TIM4->CCER=0x0300;step=33;break;
		case 13:GPIOB->BSRR=1<<13;GPIOB->BRR =1<<14;TIM4->CCER=0x0100;step=31;break;
		case 21:TIM1->CCER&=!1<<4;TIM1->CCER|=1<<8;TIM4->CCER=0x0003;step=13;break;
		case 23:GPIOB->BSRR=1<<14;GPIOB->BRR =1<<15;TIM4->CCER=0x0001;step=11;break;
		case 31:TIM1->CCER&=!1<<8;TIM1->CCER|=1;TIM4->CCER=0x0030;step=23;break;
		case 33:GPIOB->BSRR=1<<15;GPIOB->BRR =1<<13;TIM4->CCER=0x0010;step=21;break;
		} 
	
//	TIM4->EGR=1;
//PA15、PB3、4、5可用,对应S7、8、9
	GPIOA->BSRR|=1<<15;							//GPIOA_Pin15置为高电平
	k=TIM1->CCR1;
	rr1++;
	if((rr1>=119)||(k<=150))
	{	
	if((GPIOB->IDR&1<<3)&&(k<500))
		k++;								//S7键加占空比
	if((GPIOB->IDR&1<<5)&&(k>50))
		k--;								//S9键减占空比
	if(k<100)
		k++;
	TIM1->CCR1=k;							//设置占空比
	TIM1->CCR2=k;							//设置占空比
	TIM1->CCR3=k;							//设置占空比
	rr1=0;
	}
	TIM4->SR=0;
}

#endif


/*************************************************************************************************************

*************************************************主程序开始***************************************************

*************************************************************************************************************/
 int main(void)
{
	unsigned int k;

//初始设置	
	RCC->APB2ENR=0x0A1D;					//开启TIM1和ADC1、GPIOA、B、C、AFIO时钟
	RCC->APB2RSTR=0x0A1D;					//复位
	RCC->APB2RSTR=0;						//复位结束

	RCC->APB1ENR=0x00000005;				//开启TIM2、4时钟
	RCC->APB1RSTR=0x00000005;				//复位
	RCC->APB1RSTR=0;						//复位结束

#ifdef H_on
//H-on L-owm方式
	GPIOA->CRL=0x22222222;					//设置PA0-7为推挽输出,速度2MHz
	GPIOA->CRH=0x222AA222;					//PA11、12为复用推挽输出,其余为推挽输出,速度2MHz
	GPIOA->ODR=0x003F;						//显示0,其余低电平

	GPIOB->ODR=0x13C4;						//PB3、4、5为下拉输入,PB6、7、8为上拉输入,PB2、9、12输出高电平
	GPIOB->CRL=0x88888200;					//设置PB0、1为模拟输入,PB2为推挽输出,速度2MHz,其余上下拉输入
	GPIOB->CRH=0xAAA2DD28;					//设置PB8上拉输入,PB9推挽输出,速度2MHz,PB10、11为复用OD输出,10MHz,PB12推挽输出,PB13-15复用推挽输出,速度2MHz
#else
//H-pwm L-on方式
	GPIOA->CRL=0x22222222;					//设置PA0-7为推挽输出,速度2MHz
	GPIOA->CRH=0x244AAAAA;					//设置PA8-12为复用推挽输出,PA15推挽输出,速度2MHz,其余输入
	GPIOA->ODR=0x003F;						//显示0,其余低电平

	GPIOB->ODR=0xF3C4;						//PB3、4、5为下拉输入,PB6、7、8为上拉输入,PB13、14、15输出高电平	
	GPIOB->CRL=0x88888200;					//设置PB0、1为模拟输入,PB2为推挽输出,速度2MHz,PB3-5为上下拉输入,PB6-7为上下拉输入
	GPIOB->CRH=0x2222DD28;					//设置PB8上下拉输入,PB9推挽输出,速度2MHz,PB10、11为复用OD输出,10MHz,PB12-15推挽输出,速度2MHz
#endif 
	
	GPIOC->CRH=0x22844444;					//设置PC13为上拉输入,PC14、15为推挽输出,速度2MHz,其余输入
	GPIOC->ODR=0xE000;						//PC13为上拉输入

//TIM1_CH1 =PA8 (U+),TIM1_CH2 =PA9 (V+),TIM1_CH3 =PA10(W+)
//TIM1_CH1N=PB13(U-),TIM1_CH2N=PB14(V-),TIM1_CH3N=PB15(W-)
//BEMF比较U=TIM4_CH3,V=TIM4_CH1,W=TIM4_CH2

#ifdef H_on
//**********************H-on L-pwm方式启动段********************************************************************************   
	TIM1->CCMR1=0x6060;						//设置TIM1_CH1、CH2为PWM1模式
	TIM1->CCMR2=0x0060;						//设置TIM1_CH3为PWM1模式
	TIM1->CCER=0x0CCC;						//TIM1_OC1、2、3,高电平有效,OC1N、2N、3N低电平有效,开启OC1N、2N、3N输出
	TIM1->ARR=499;							//设置计数周期,频率16KHz
	TIM1->CCR1=0;							//设置启动最低占空比0%
	TIM1->CCR2=0;							//设置启动最低占空比0%
	TIM1->CCR3=0;							//设置启动最低占空比0%
	TIM1->BDTR=0x8000;						//TIM1主输出使能	
	TIM1->CR1|=1<<0;						//启动TIM1,使得TIM1_CH1N、2N、3N输出高电平

//电机预定位,准备启动
	TIM1->CCR1=69;									//打开TIM_CH1NPWM,U-
	GPIOA->BSRR|=1<<10;								//GPIOA_Pin10高电平,打开W+,WU通电
	delay(500000);									//保持约250ms
	TIM1->CCR1=0;									//关闭TIM_CH1NPWM,关闭U-
	delay(500000);									//断电,保持约250ms	
	TIM1->CCR2=69;									//打开TIM_CH2NPWM,打开V-,WV通电
	delay(500000);									//保持约250ms  
	GPIOA->BRR|=1<<10;								//GPIOA_Pin10低电平,关闭W+
	delay(200000);									//断电,保持约100ms,电机定位
	 	
//启动和自由加速段,转速至当前最高速度80%以下,防止速度过快丢步
	for(k=30000;k>20000;k-=200)
	{
		GPIOA->BSRR|=1<<8;								//GPIOA_Pin8高电平,打开U+
		delay(k);										//UV通电
		TIM1->CCR2=0;									//关闭TIM_CH2NPWM,V-

		TIM1->CCR3=69;									//打开TIM_CH3NPWM,W-
		delay(k);										//UW通电
		GPIOA->BRR|=1<<8;								//GPIOA_Pin8低电平,关闭U+

		GPIOA->BSRR|=1<<9;								//GPIOA_Pin9高电平,V+
		delay(k);										//VW通电
		TIM1->CCR3=0;									//关闭TIM_CH3NPWM,W-

		TIM1->CCR1=69;									//打开TIM_CH1NPWM,U-
		delay(k);										//VU通电
		GPIOA->BRR|=1<<9;								//GPIOA_Pin8低电平,关闭V+

		GPIOA->BSRR|=1<<10;								//GPIOA_Pin10高电平,打开W+
		delay(k);										//WU通电
		TIM1->CCR1=0;									//关闭TIM_CH1NPWM,关闭U-

		TIM1->CCR2=69;									//打开TIM_CH2NPWM,V-
		delay(k);										//WV通电
		GPIOA->BRR|=1<<10;								//GPIOA_Pin10低电平,关闭W+
	}
	GPIOA->BSRR|=1<<8;								//GPIOA_Pin8高电平,打开U+,UV通电


#else
//**********************H-pwm L-on方式启动段******************************************************
	TIM1->CCMR1=0x6060;						//设置TIM1_CH1、CH2为PWM1模式
	TIM1->CCMR2=0x0060;						//设置TIM1_CH3为PWM1模式
	TIM1->CCER=0x0888;						//TIM1_OC1、2、3,高电平有效,OCxN低电平有效,禁止输出
	TIM1->ARR=499;							//设置计数周期,频率16KHz
	TIM1->CCR1=49;							//设置启动最低占空比=10%
	TIM1->CCR2=49;							//设置启动最低占空比=10%
	TIM1->CCR3=49;							//设置启动最低占空比=10%
	TIM1->BDTR=0x8000;						//TIM1主输出使能

//电机预定位,准备启动
	TIM1->CCER|=1<<8;								//打开TIM_CH3PWM
	TIM1->CR1|=1<<0;								//启动TIM1
	GPIOB->BRR=1<<13;								//GPIOB_Pin13低电平,WU通电
	delay(500000);									//保持约250ms
	GPIOB->BSRR=1<<13;								//GPIOB_Pin13高电平
	delay(500000);									//断电,保持约250ms	
	GPIOB->BRR=1<<14;								//GPIOB_Pin14低电平,WV通电
	delay(500000);									//保持约250ms  
	TIM1->CCER&=!1<<8;								//关闭TIM1_CH3
	delay(200000);									//断电,保持约100ms,电机定位

//启动和自由加速段,转速至当前最高速度80%以下,防止速度过快丢步
	for(k=30000;k>20000;k-=200)
	{
		TIM1->CCER|=1;								//打开TIM_CH1
		GPIOB->BRR=1<<14;							//GPIOB_Pin14低电平		  
		delay(k);									//45000对应保持约45.2ms,221rpm,UV通电
		GPIOB->BSRR =1<<14;							//GPIOB_Pin14高电平

		GPIOB->BRR=1<<15;							//GPIOB_Pin15低电平
		delay(k);									//UW通电
		TIM1->CCER&=!1;								//关闭TIM1_CH1

		TIM1->CCER|=1<<4;							//打开TIM_CH2
		delay(k);									//VW通电
		GPIOB->BSRR=1<<15;							//GPIOB_Pin15高电平

		GPIOB->BRR=1<<13;							//GPIOB_Pin13低电平
		delay(k);									//VU通电
		TIM1->CCER&=!1<<4;							//关闭TIM1_CH2

		TIM1->CCER|=1<<8;							//打开TIM_CH3
		delay(k);									//WU通电
		GPIOB->BSRR=1<<13;							//GPIOB_Pin13高电平

		GPIOB->BRR=1<<14;							//GPIOB_Pin14低电平
		delay(k);									//WV通电
		TIM1->CCER&=!1<<8;							//关闭TIM1_CH3
	}
	TIM1->CCER|=1;									//打开TIM1_CH1PWM,UV通电
#endif


//准备换向****************************************************************************************************************************
	step=23;										//设定工作状态标记
	TIM4->CCMR1=0xF1F1;								//允许CH1、2触发捕获,采样频率fSAMPLING=fDTS/32,N=8,每一个边沿都触发一次捕获
	TIM4->CCMR2=0x00F1;								//允许CH3触发捕获,采样频率fSAMPLING=fDTS/32,N=8,每一个边沿都触发一次捕获
	TIM4->ARR=0xFFFF;								//设置重装载值
	TIM4->PSC=79;									//TIM4预分频80
	TIM4->DIER=0x000E;								//允许TIM4_CH1、2、3捕获中断
	NVIC->ISER[0]=0x40000000;						//开启TIM4中断
	TIM4->CCER=0x0030;								//开启W相TIM4_CH2捕获,设定下降沿
	TIM4->CR1=0x0201;								//启动TIM4,采样频率tDTS=4*tCK_INT

//显示电机转速,只保留个位显示,防止显示错误*******************************************************************************************
	GPIOC->BRR=1<<14;							//关闭GPIOC_Pin14=N1
	GPIOC->BRR=1<<15;							//关闭GPIOC_Pin15=N2
	GPIOB->BRR=1<<2;							//关闭GPIOB_Pin2=N3
	GPIOB->BRR=1<<12;							//关闭GPIOB_Pin12=N4
	AFIO->MAPR=0x02000000;						//关闭JTAG-DP,保留SW-DP
	while(1)
	{
		unsigned int zero,result,display[5];
		result=500000/cycle;								//实测周期变换为转速
		for(k=0;k<5;k++)						//16进制变为10进制
		{
			display[k]=result%10;				//display[]得到result个位数
			result/=10;							//除以10并自动舍去小数位
		}
		for(k=0;k<5;k++)						//10进制数转化为数码管段位
			{switch(display[k])
				{
				case 0:display[k]=0x0000003F;break;
				case 1:display[k]=0x00000006;break;
				case 2:display[k]=0x0000005B;break;
				case 3:display[k]=0x0000004F;break;
				case 4:display[k]=0x00000066;break;
				case 5:display[k]=0x0000006D;break;
				case 6:display[k]=0x0000007D;break;
				case 7:display[k]=0x00000007;break;
				case 8:display[k]=0x0000007F;break;
				case 9:display[k]=0x0000006F;break;
				default:display[k]=0x00000071;
				}
			}

		for(k=0;k<=20;k++)							//防止示数抖动频繁,延长一个数据显示时间
		{
		if (display[4]!=0x0000003F)					//最高位为0消隐
		{
		GPIOA->BRR|=0x0000007F;						//关闭全部显示
		GPIOA->BSRR|=display[4];
		GPIOC->BSRR=1<<14;							//开启GPIOC_Pin14=N1
		delay(5000);
		GPIOC->BRR=1<<14;							//关闭GPIOC_Pin14=N1
		zero=1;										//最高位不为0
		}
		else zero=0;								//最高位为0,消隐

		if(zero||(display[3]!=0x3F))				//前一位消隐且本位为0消隐
		{
		GPIOA->BRR|=0x0000007F;						//关闭全部显示
		GPIOA->BSRR|=display[3];
		GPIOC->BSRR=1<<15;							//开启GPIOC_Pin15=N2
		delay(5000);
		GPIOC->BRR=1<<15;							//关闭GPIOC_Pin15=N2
		zero=1;										//最高位不为0
		}
		else zero=0;								//最高位为0,消隐

		if(zero||(display[2]!=0x3F))				//前一位消隐且本位为0消隐
		{
		GPIOA->BRR|=0x0000007F;						//关闭全部显示
		GPIOA->BSRR|=display[2];
		GPIOB->BSRR=1<<2;							//开启GPIOB_Pin2=N3
		delay(5000);
		GPIOB->BRR=1<<2;							//关闭GPIOB_Pin2=N3
		zero=1;										//最高位不为0
		}
		else zero=0;								//最高位为0,消隐

		if(zero||(display[1]!=0x3F))				//前一位消隐且本位为0消隐
		{
		GPIOA->BRR|=0x0000007F;						//关闭全部显示
		GPIOA->BSRR|=display[1];
		GPIOB->BSRR=1<<12;							//开启GPIOB_Pin12=N4
		delay(5000);
		GPIOB->BRR=1<<12;							//关闭GPIOB_Pin12=N4
		}
	
		GPIOA->BRR|=0x0000007F;						//关闭全部显示
		GPIOA->BSRR|=display[0];
		GPIOB->BSRR=1<<9;							//开启GPIOB_Pin9=N5
		delay(5000);
		GPIOB->BRR=1<<9;
		}
	}
}
回复 支持 反对

使用道具 举报

  离线 

31

主题

124

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1564
金钱
1564
注册时间
2014-6-30
在线时间
233 小时
发表于 2017-1-6 09:26:14 | 显示全部楼层
感谢分享这么好的资料
在电路上充实自己
回复 支持 反对

使用道具 举报

  离线 

10

主题

89

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2016-12-12
在线时间
53 小时
发表于 2017-1-6 09:40:13 | 显示全部楼层
支持!!
回复 支持 反对

使用道具 举报

  离线 

12

主题

429

帖子

0

精华

高级会员

Rank: 4

积分
719
金钱
719
注册时间
2012-6-21
在线时间
57 小时
发表于 2017-1-6 16:23:54 来自手机 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

pcb54321 该用户已被删除
发表于 2017-1-7 00:01:32 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

  离线 

6

主题

267

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2349
金钱
2349
注册时间
2016-7-17
在线时间
347 小时
 楼主| 发表于 2017-1-7 08:58:47 | 显示全部楼层
pcb54321 发表于 2017-1-7 00:01
居然逆向学习,一般人都是学C语言,然后操作库函数,你完全相反了,直接操作寄存器,牛逼

用汇编的时候也是直接操作寄存器,倒也没觉得不习惯。反倒是看不懂库函数,也不愿意去查手册,所以就沿袭汇编的习惯,直接写寄存器了,见笑。
回复 支持 反对

使用道具 举报

头像被屏蔽

  离线 

323

主题

390

帖子

0

精华

禁止访问

积分
1156
金钱
1156
注册时间
2016-12-26
在线时间
33 小时
发表于 2017-1-7 09:04:52 | 显示全部楼层
写的真好!  我也在努力中加油
回复 支持 反对

使用道具 举报

  离线 

6

主题

267

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2349
金钱
2349
注册时间
2016-7-17
在线时间
347 小时
 楼主| 发表于 2017-1-8 18:32:58 | 显示全部楼层
rent8158669 发表于 2017-1-7 09:04
写的真好!  我也在努力中加油

谢谢夸奖,在C编程方面我是新手,感觉很多地方不太顺畅,还得学习才行。
回复 支持 反对

使用道具 举报

  离线 

0

主题

3

帖子

0

精华

高级会员

Rank: 4

积分
968
金钱
968
注册时间
2015-9-8
在线时间
65 小时
发表于 2017-2-6 10:24:28 | 显示全部楼层
感谢分享!学习一下,正好手上有个三相桥板子,有机会可以试试.
直接操作寄存器写的时候比较干脆直白
就是后来检查的时候比较费劲,给别人的可读性差了些
不过效率高不容易掉坑
我也喜欢直接操作寄存器
回复 支持 反对

使用道具 举报

flyingcross 该用户已被删除
发表于 2017-2-16 09:45:14 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

  离线 

29

主题

311

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1519
金钱
1519
注册时间
2012-9-4
在线时间
259 小时
发表于 2017-2-16 09:47:14 | 显示全部楼层
顶一下。。。
回复 支持 反对

使用道具 举报

  离线 

500

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
129741
金钱
129741
注册时间
2010-12-1
在线时间
1169 小时
发表于 2017-2-16 10:59:29 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

linzhongxi 该用户已被删除
发表于 2017-2-16 23:06:29 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

  离线 

33

主题

310

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
金钱
495
注册时间
2016-12-31
在线时间
63 小时
发表于 2017-2-17 09:58:58 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

  离线 

7

主题

143

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1172
金钱
1172
注册时间
2016-1-25
在线时间
189 小时
发表于 2017-2-17 11:18:30 | 显示全部楼层
谢谢分享。共享学习的人都是好人
回复 支持 反对

使用道具 举报

  离线 

0

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
246
金钱
246
注册时间
2016-9-5
在线时间
44 小时
发表于 2017-2-27 18:25:36 | 显示全部楼层
赞一下,有志者事竟成啊
回复 支持 反对

使用道具 举报

  离线 

0

主题

4

帖子

0

精华

新手入门

积分
43
金钱
43
注册时间
2017-3-10
在线时间
5 小时
发表于 2017-3-10 19:36:54 | 显示全部楼层
能加你好友不?也想学习电机控制
回复 支持 反对

使用道具 举报

  离线 

6

主题

488

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1549
金钱
1549
注册时间
2015-5-8
在线时间
256 小时
发表于 2017-3-10 20:00:21 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

  离线 

6

主题

267

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2349
金钱
2349
注册时间
2016-7-17
在线时间
347 小时
 楼主| 发表于 2017-3-10 21:27:26 | 显示全部楼层
053226 发表于 2017-3-10 19:36
能加你好友不?也想学习电机控制

可以,互相帮助!
回复 支持 反对

使用道具 举报

  离线 

0

主题

4

帖子

0

精华

新手入门

积分
43
金钱
43
注册时间
2017-3-10
在线时间
5 小时
发表于 2017-3-11 09:21:57 | 显示全部楼层
f1174562 发表于 2017-3-10 21:27
可以,互相帮助!

877607606我在QQ号
回复 支持 反对

使用道具 举报

  离线 

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2017-4-10
在线时间
26 小时
发表于 2017-4-12 10:52:31 | 显示全部楼层
楼主不错,谢谢你你的分享。
回复 支持 反对

使用道具 举报

  离线 

4

主题

199

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2108
金钱
2108
注册时间
2016-7-6
在线时间
446 小时
发表于 2017-4-12 18:50:02 | 显示全部楼层
感谢分享!
回复 支持 反对

使用道具 举报

  离线 

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2015-9-14
在线时间
27 小时
发表于 2017-4-12 20:17:27 | 显示全部楼层
跟神一样的存在,佩服啊。
回复 支持 反对

使用道具 举报

  离线 

0

主题

5

帖子

0

精华

新手入门

积分
40
金钱
40
注册时间
2015-8-2
在线时间
4 小时
发表于 2017-4-13 09:31:28 | 显示全部楼层
汝甚叼 令尊知否
回复 支持 反对

使用道具 举报

  离线 

0

主题

5

帖子

0

精华

新手入门

积分
40
金钱
40
注册时间
2015-8-2
在线时间
4 小时
发表于 2017-4-13 09:35:06 | 显示全部楼层
edacat 发表于 2017-2-6 10:24
感谢分享!学习一下,正好手上有个三相桥板子,有机会可以试试.
直接操作寄存器写的时候比较干脆直白
就是后 ...

我也喜欢直接寄存器,库函数老是掉坑。
回复 支持 反对

使用道具 举报

  离线 

1

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2016-5-11
在线时间
15 小时
发表于 2017-6-27 12:17:33 | 显示全部楼层
感谢分享
回复 支持 反对

使用道具 举报

  离线 

1

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2017-6-16
在线时间
26 小时
发表于 2017-6-27 14:45:46 来自手机 | 显示全部楼层
楼主好6
回复 支持 反对

使用道具 举报

  离线 

58

主题

301

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1301
金钱
1301
注册时间
2016-1-7
在线时间
279 小时
发表于 2017-6-28 08:23:27 | 显示全部楼层
感谢分享!
回复 支持 反对

使用道具 举报

  离线 

1

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2016-11-22
在线时间
34 小时
发表于 2017-8-26 20:49:23 | 显示全部楼层
请问一下,楼主反电动势过零检测rc延时时间是怎么得到的?
回复 支持 反对

使用道具 举报

  离线 

0

主题

127

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2017-5-26
在线时间
76 小时
发表于 2017-8-27 09:37:56 来自手机 | 显示全部楼层
顶,,,
来自: 微社区
回复 支持 反对

使用道具 举报

  离线 

6

主题

267

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2349
金钱
2349
注册时间
2016-7-17
在线时间
347 小时
 楼主| 发表于 2017-8-27 18:19:29 | 显示全部楼层
songxin84664918 发表于 2017-8-26 20:49
请问一下,楼主反电动势过零检测rc延时时间是怎么得到的?

仿真得到的,我用的PROTEUS
回复 支持 反对

使用道具 举报

  离线 

10

主题

158

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2017-4-20
在线时间
102 小时
发表于 2017-8-28 17:19:14 | 显示全部楼层
66666  感觉寄存器 好难 我是先学库   觉得有必要学下寄存器
回复 支持 反对

使用道具 举报

  离线 

38

主题

302

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
435
金钱
435
注册时间
2012-3-6
在线时间
4 小时
发表于 2017-8-28 17:35:20 | 显示全部楼层
朋友 ,我有点不明白的地方能指点指点么。QQ:123353070
ES?全称?Embedded?Show;ES是由众多嵌入式爱好者组织的一个团队,致力于带领学生进步,帮助毕业生找到工作,更重要的是在职的嵌入式工作者提供自主外包和创业的机会。(详情进群查看) ES的宗旨是:交流共享与合作发展。ES?QQ群?第三群:152820643?。群内论坛有很多嵌入式开发模块解决方案可以参考。进群的立马共享自己做的模块简介。
回复 支持 反对

使用道具 举报

  离线 

0

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
483
金钱
483
注册时间
2017-6-23
在线时间
49 小时
发表于 2017-8-29 13:49:20 | 显示全部楼层
感谢分享      
回复 支持 反对

使用道具 举报

  离线 

17

主题

181

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
466
金钱
466
注册时间
2017-7-24
在线时间
105 小时
发表于 2017-8-29 14:26:59 | 显示全部楼层
顶一下
回复 支持 反对

使用道具 举报

  离线 

2

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2016-7-9
在线时间
46 小时
发表于 2017-8-29 15:23:41 | 显示全部楼层
感谢分享!
回复 支持 反对

使用道具 举报

  离线 

1

主题

17

帖子

0

精华

新手入门

积分
42
金钱
42
注册时间
2017-7-29
在线时间
17 小时
发表于 2017-8-30 09:38:36 | 显示全部楼层
真心顶,最近也在弄着无刷方面,需要向您学习
回复 支持 反对

使用道具 举报

  离线 

6

主题

267

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2349
金钱
2349
注册时间
2016-7-17
在线时间
347 小时
 楼主| 发表于 2017-8-30 09:58:23 | 显示全部楼层
共同学习
回复 支持 反对

使用道具 举报

  离线 

8

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
450
金钱
450
注册时间
2017-7-13
在线时间
55 小时
发表于 2017-8-30 10:42:23 | 显示全部楼层
感谢楼主分享
回复 支持 反对

使用道具 举报

  离线 

0

主题

5

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2017-2-1
在线时间
3 小时
发表于 2017-9-18 13:40:28 | 显示全部楼层
楼主,关于你的原理图我有几个疑问,希望你解答下
VCC是多少伏?
14V5是14.5伏吗?

如果是有感电机的三根hall线接在图中哪三个节点?

还有图中得的箭头是什么意思?

谢谢,
回复 支持 反对

使用道具 举报

  离线 

6

主题

267

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2349
金钱
2349
注册时间
2016-7-17
在线时间
347 小时
 楼主| 发表于 2017-9-18 19:29:34 | 显示全部楼层
奥特曼打小怪兽 发表于 2017-9-18 13:40
楼主,关于你的原理图我有几个疑问,希望你解答下
VCC是多少伏?
14V5是14.5伏吗?

VCC16-36V,14V5是14.5V,霍尔传感器接在P19、P20和P21,箭头的问题你截下图给我看看。
回复 支持 反对

使用道具 举报

  离线 

5

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
444
金钱
444
注册时间
2016-8-8
在线时间
101 小时
发表于 2017-9-18 21:11:38 | 显示全部楼层
收藏要回,谢谢!
回复 支持 反对

使用道具 举报

  离线 

0

主题

5

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2017-2-1
在线时间
3 小时
发表于 2017-9-19 14:48:20 | 显示全部楼层
f1174562 发表于 2017-9-18 19:29
VCC16-36V,14V5是14.5V,霍尔传感器接在P19、P20和P21,箭头的问题你截下图给我看看。

谢谢楼主,楼主QQ号多少,我还有些问题
回复 支持 反对

使用道具 举报

  离线 

6

主题

267

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2349
金钱
2349
注册时间
2016-7-17
在线时间
347 小时
 楼主| 发表于 2017-9-20 21:34:27 | 显示全部楼层
奥特曼打小怪兽 发表于 2017-9-19 14:48
谢谢楼主,楼主QQ号多少,我还有些问题

我加你吧,你的QQ号?
回复 支持 反对

使用道具 举报

  离线 

0

主题

5

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2017-2-1
在线时间
3 小时
发表于 2017-9-21 16:35:19 | 显示全部楼层
1289075287  北斗
回复 支持 反对

使用道具 举报

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

本版积分规则




关闭

"原子哥”推荐上一条 /1 下一条

QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-7-20 16:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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