高中之前一直想做的,拖到大学来做。
很多人可能不了解磁力搅拌器
百度百科:磁力搅拌器是用于液体混合的实验室仪器,主要用于搅拌或同时加热搅拌低粘稠度的液体或固液混合物。其基本原理是利用磁场的同性相斥、异性相吸的原理,使用磁场推动放置在容器中带磁性的搅拌子进行圆周运转,从而达到搅拌液体的目的。配合加热温度控制系统,可以根据具体的实验要求加热并控制样本温度,维持实验条件所需的温度条件,保证液体混合达到实验需求。
简单说一般的磁力搅拌器是电动机带着两块磁铁,吸着磁搅子转动,磁搅子搅动液体。
我想做的的这个原理类似于多相电动机。
设计电路
这是驱动线圈的一个桥臂,一组线圈有两个桥臂。
(图中短路,实际禁止出现这种情况)
每个桥臂都是由四个线圈串联得到的,一共有6个线圈。
连接方式如图这样
一共六个线圈,按照三相送电是4个相串,购买的线圈是3欧多一个,电感量200度,电流不算太大
通电之后,电流这样流动,磁极会这样分布(只画出一步):
PCB(有误的图纸,做出来才发现线圈连线错了,忧伤的故事。)
使用的单片机是STM32F103C8T6,可调电阻控制转速,USB供电,线圈中央装有18B20温度传感器和一个RGB灯。
32算是很成熟的单片机了,使用也很简单。
MOS管用的小封装低压的SI2302/2301 ,驱动MOS用的s8050
打印出1:1等大小的比较下。线圈的封装画的有些大,线圈用的定做的自粘线圈。3Ohm 270μH
【待续】
这部分是制作硬件
先焊接低矮的贴片封装元件
![](/uploads/allimg/170527/2210011530-7.jpg?224)
然后焊接直插元件和接口,最后焊接线圈
(大的USB接口是备用的,排针是SWD烧写口)
![](/uploads/allimg/170527/22100155R-8.jpg?226)
还订做了亚克力面板,铜柱长了,然而忘记买合适长度的
![](/uploads/allimg/170527/221001DI-9.jpg?203)
![](/uploads/allimg/170527/2210015X9-10.jpg?203)
![](/uploads/allimg/170527/2210013112-11.jpg?197)
感觉良好=-=浑然不觉电路设计错误
焊上线圈,但是线圈会乱抖,需要加装固定
![](/uploads/allimg/170527/2210015931-12.jpg?248)
用洗板水洗过板子之后滴上环氧树脂(透明的又叫水晶滴胶),一般电气上用于固定和隔离以及封装用
线圈永远被封印在板子上了。
![](/uploads/allimg/170527/2210011S7-13.jpg?278)
再装上面板,显得很好看吧!
p.s.朋友说那个旋钮很掉价...不知道怎样的旋钮显得高大上呢?
![](/uploads/allimg/170527/221001C31-14.jpg?250)
明明很漂亮的...
![](/uploads/allimg/170527/2210013R1-15.jpg?217)
还印了两个LOGO
![](/uploads/allimg/170527/221001BR-16.jpg?198)
然后发现了那个失误...进行了飞线补救
![](/uploads/allimg/170527/221001C29-17.jpg?186)
![](/uploads/allimg/170527/22100124V-18.jpg?157)
还好是装在壳子里的...
苦逼代码
三相电机驱动部分:DP是相位的flag
这段插到中断里,通过改变中断的ARR值来改变速度
每个桥臂有三个状态:拉高,拉低,浮空。
这样是一个3相同步电机,一个周期一圈是不是有点多了
-
switch(DP){ //换向,严禁N=0,P=1!
-
case 1:{//1相高,2相低
-
PD3N=PD2N=PD1N=1;
-
PD3P=PD2P=PD1P=0;
-
PD1N=PD1P=1;
-
PD2N=PD2P=0;
-
DP=2;
-
break;
-
}case 2:{//2相高,3相低
-
PD3N=PD2N=PD1N=1;
-
PD3P=PD2P=PD1P=0;
-
PD2N=PD2P=1;
-
PD3N=PD3P=0;
-
DP=3;
-
break;
-
}case 3:{//3相高,1相低
-
PD3N=PD2N=PD1N=1;
-
PD3P=PD2P=PD1P=0;
-
PD3N=PD3P=1;
-
PD1N=PD1P=0;
-
DP=1;
-
break;
-
}
配置IO和中断
-
/*控制IO*/
-
GPIO_InitTypeDef GPIO_InitStructure;
-
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);
-
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12;#p#分页标题#e#
-
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
-
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
-
GPIO_Init(GPIOA, &GPIO_InitStructure);
-
GPIO_ResetBits(GPIOA,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12);
-
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
-
GPIO_Init(GPIOB, &GPIO_InitStructure);
-
GPIO_ResetBits(GPIOB,GPIO_Pin_15);
-
PD3N=PD2N=PD1N=1;
-
PD3P=PD2P=PD1P=0;
-
/*LED IO*/
-
GPIO_InitTypeDef GPIO_InitStructure;
-
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
-
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14;
-
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
-
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
-
GPIO_Init(GPIOB, &GPIO_InitStructure);
-
GPIO_ResetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14);
-
GPIO_SetBits(GPIOB,GPIO_Pin_6);
-
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
-
NVIC_InitTypeDef NVIC_InitStructure;
-
/*输出中断*/
-
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
-
TIM_TimeBaseStructure.TIM_Period = fz; //ARR
-
TIM_TimeBaseStructure.TIM_Prescaler =719; //预分频
-
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
-
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
-
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
-
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );
-
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
-
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //优先级0
-
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
-
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
-
NVIC_Init(&NVIC_InitStructure);
-
TIM_Cmd(TIM3, ENABLE); //使能
-
/*这个中断用于更新可调电阻和转速,20ms*/
-
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
-
NVIC_InitTypeDef NVIC_InitStructure;
-
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
-
TIM_TimeBaseStructure.TIM_Period = 2499;
-
TIM_TimeBaseStructure.TIM_Prescaler =719;
-
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
-
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
-
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
-
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE );
-
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
-
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
-
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
-
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
-
NVIC_Init(&NVIC_InitStructure);
-
TIM_Cmd(TIM4, ENABLE);
-
/*ADC使能*/
-
ADC_InitTypeDef ADC_InitStructure;
-
GPIO_InitTypeDef GPIO_InitStructure;
-
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE );
-
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
-
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
-
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
-
GPIO_Init(GPIOA, &GPIO_InitStructure);
-
ADC_DeInit(ADC1);
-
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
-
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
-
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
-
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
-
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
-
ADC_InitStructure.ADC_NbrOfChannel = 1;
-
ADC_Init(ADC1, &ADC_InitStructure);
-
ADC_Cmd(ADC1, ENABLE);
-
ADC_ResetCalibration(ADC1);
-
while(ADC_GetResetCalibrationStatus(ADC1));
-
ADC_StartCalibration(ADC1);
-
while(ADC_GetCalibrationStatus(ADC1));
-
/*LED用定时器TIM2*/
-
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
-
NVIC_InitTypeDef NVIC_InitStructure;
-
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
-
TIM_TimeBaseStructure.TIM_Period = arr;
-
TIM_TimeBaseStructure.TIM_Prescaler =psc;
-
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
-
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
-
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
-
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE );
-
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
-
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
-
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
-
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
-
NVIC_Init(&NVIC_InitStructure);
-
TIM_Cmd(TIM2, ENABLE);
中断:
-
void TIM3_IRQHandler(void){
-
if( TIM_GetITStatus( TIM3, TIM_IT_Update )!= RESET ){
-
TIM_ClearITPendingBit( TIM3, TIM_IT_Update );
-
switch(DP){
-
case 1:{
-
PD3N=PD2N=PD1N=1;
-
PD3P=PD2P=PD1P=0;
-
PD1N=PD1P=1;
-
PD2N=PD2P=0;
-
DP=2;
-
break;
-
}case 2:{
-
PD3N=PD2N=PD1N=1;
-
PD3P=PD2P=PD1P=0;
-
PD2N=PD2P=1;
-
PD3N=PD3P=0;
-
DP=3;
-
break;
-
}case 3:{#p#分页标题#e#
-
PD3N=PD2N=PD1N=1;
-
PD3P=PD2P=PD1P=0;
-
PD3N=PD3P=1;
-
PD1N=PD1P=0;
-
DP=1;
-
break;
-
}
-
}
-
TIM3->ARR=fz_buf;
-
}
-
}
-
void TIM4_IRQHandler(void)
-
if( TIM_GetITStatus( TIM4, TIM_IT_Update )!= RESET ){
-
TIM_ClearITPendingBit( TIM4, TIM_IT_Update );
-
fz=500+8000*Get_Adc()/4095;
-
}
-
}
主函数只是初始化,其他的不要乱丢到主函数里:
-
int main(void){
-
delay_init();
-
NVIC_Configuration();
-
init();
-
while(1){
-
if(Get_Adc()==4095){ //转到头?
-
BLUE=1;
-
}else{
-
BLUE=0;
-
}
-
}
-
}
相位图
![](/uploads/allimg/170527/2210015I1-19.png?93)
每次换相中间的绿灯会闪一次,旋转变阻器可以控制速度,不会马上到转到的速度位置,会缓慢加速/减速防止跳子。
![](/uploads/allimg/170527/2210014R6-20.jpg?216)
录了个视频。背景的啪啦啪啦声音是舍友的机械键盘=-=觉得好吵
力量太小了,转快乐很难吸住磁子,有空抬高电压试试,使用的时候就是把那玩意放在杯子里,被子放在上面,形成一个小漩涡。
【待续】
(责任编辑:admin) |