最好的电子音响科技diy制作网站

haoDIY_音响电子电脑科技DIY小制作发明

当前位置: 主页 > 科技DIY > 电动/发电/电磁 >

固态磁力搅拌器制作(附电路+源代码)

时间:2017-05-28 19:52来源:数码之家 作者:admin 点击:
}case 3:{ 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_Clea
高中之前一直想做的,拖到大学来做。

很多人可能不了解磁力搅拌器

百度百科:磁力搅拌器是用于液体混合的实验室仪器,主要用于搅拌或同时加热搅拌低粘稠度的液体或固液混合物。其基本原理是利用磁场的同性相斥、异性相吸的原理,使用磁场推动放置在容器中带磁性的搅拌子进行圆周运转,从而达到搅拌液体的目的。配合加热温度控制系统,可以根据具体的实验要求加热并控制样本温度,维持实验条件所需的温度条件,保证液体混合达到实验需求。

简单说一般的磁力搅拌器是电动机带着两块磁铁,吸着磁搅子转动,磁搅子搅动液体。
我想做的的这个原理类似于多相电动机。


设计电路
这是驱动线圈的一个桥臂,一组线圈有两个桥臂。
(图中短路,实际禁止出现这种情况)
固态磁力搅拌器制作(附电路+源代码)



每个桥臂都是由四个线圈串联得到的,一共有6个线圈。
连接方式如图这样
固态磁力搅拌器制作(附电路+源代码)

固态磁力搅拌器制作(附电路+源代码)

一共六个线圈,按照三相送电是4个相串,购买的线圈是3欧多一个,电感量200度,电流不算太大


通电之后,电流这样流动,磁极会这样分布(只画出一步):
固态磁力搅拌器制作(附电路+源代码)




PCB(有误的图纸,做出来才发现线圈连线错了,忧伤的故事。)
固态磁力搅拌器制作(附电路+源代码)




固态磁力搅拌器制作(附电路+源代码)



使用的单片机是STM32F103C8T6,可调电阻控制转速,USB供电,线圈中央装有18B20温度传感器和一个RGB灯。
32算是很成熟的单片机了,使用也很简单。
MOS管用的小封装低压的SI2302/2301 ,驱动MOS用的s8050


固态磁力搅拌器制作(附电路+源代码)


打印出1:1等大小的比较下。线圈的封装画的有些大,线圈用的定做的自粘线圈。3Ohm 270μH


【待续】


这部分是制作硬件
先焊接低矮的贴片封装元件




然后焊接直插元件和接口,最后焊接线圈
(大的USB接口是备用的,排针是SWD烧写口)




还订做了亚克力面板,铜柱长了,然而忘记买合适长度的





感觉良好=-=浑然不觉电路设计错误




焊上线圈,但是线圈会乱抖,需要加装固定




用洗板水洗过板子之后滴上环氧树脂(透明的又叫水晶滴胶),一般电气上用于固定和隔离以及封装用
线圈永远被封印在板子上了。




再装上面板,显得很好看吧!
p.s.朋友说那个旋钮很掉价...不知道怎样的旋钮显得高大上呢?




明明很漂亮的...



还印了两个LOGO







然后发现了那个失误...进行了飞线补救




还好是装在壳子里的...
苦逼代码
三相电机驱动部分:DP是相位的flag
这段插到中断里,通过改变中断的ARR值来改变速度
每个桥臂有三个状态:拉高,拉低,浮空。
这样是一个3相同步电机,一个周期一圈是不是有点多了

  1.         switch(DP){           //换向,严禁N=0,P=1!
  2.             case 1:{//1相高,2相低
  3.                 PD3N=PD2N=PD1N=1;    
  4.                 PD3P=PD2P=PD1P=0;
  5.                 PD1N=PD1P=1;
  6.                 PD2N=PD2P=0;
  7.                 DP=2;
  8.                 break;
  9.             }case 2:{//2相高,3相低
  10.                 PD3N=PD2N=PD1N=1;  
  11.                 PD3P=PD2P=PD1P=0;
  12.                 PD2N=PD2P=1;
  13.                 PD3N=PD3P=0;
  14.                 DP=3;
  15.                 break;
  16.             }case 3:{//3相高,1相低
  17.                 PD3N=PD2N=PD1N=1;  
  18.                 PD3P=PD2P=PD1P=0;
  19.                 PD3N=PD3P=1;
  20.                 PD1N=PD1P=0;
  21.                 DP=1;
  22.                 break;
  23.             }

            
配置IO和中断

  1. /*控制IO*/
  2. GPIO_InitTypeDef  GPIO_InitStructure;
  3. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);#p#分页标题#e#
  4. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12;
  5. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  6. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  7. GPIO_Init(GPIOA, &GPIO_InitStructure);                  
  8. GPIO_ResetBits(GPIOA,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12);
  9. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;              
  10. GPIO_Init(GPIOB, &GPIO_InitStructure);                    
  11. GPIO_ResetBits(GPIOB,GPIO_Pin_15);
  12. PD3N=PD2N=PD1N=1;  
  13. PD3P=PD2P=PD1P=0;
  14. /*LED IO*/
  15. GPIO_InitTypeDef  GPIO_InitStructure;
  16. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  17. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14;
  18. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  19. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  20. GPIO_Init(GPIOB, &GPIO_InitStructure);
  21. GPIO_ResetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14);
  22. GPIO_SetBits(GPIOB,GPIO_Pin_6);
  23.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  24.     NVIC_InitTypeDef NVIC_InitStructure;
  25. /*输出中断*/
  26.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  27.     TIM_TimeBaseStructure.TIM_Period = fz;    //ARR
  28.     TIM_TimeBaseStructure.TIM_Prescaler =719;   //预分频
  29.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  30.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  31.     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  32.     TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );
  33.     NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  34.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;   //优先级0
  35.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  36.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  37.     NVIC_Init(&NVIC_InitStructure);
  38.     TIM_Cmd(TIM3, ENABLE);  //使能      
  39. /*这个中断用于更新可调电阻和转速,20ms*/
  40.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  41.     NVIC_InitTypeDef NVIC_InitStructure;
  42.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
  43.     TIM_TimeBaseStructure.TIM_Period = 2499;
  44.     TIM_TimeBaseStructure.TIM_Prescaler =719;
  45.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  46.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  47.     TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
  48.     TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE );
  49.     NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
  50.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  51.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  52.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  53.     NVIC_Init(&NVIC_InitStructure);
  54.     TIM_Cmd(TIM4, ENABLE);
  55. /*ADC使能*/
  56.     ADC_InitTypeDef ADC_InitStructure;
  57.     GPIO_InitTypeDef GPIO_InitStructure;
  58.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1    , ENABLE );
  59.     RCC_ADCCLKConfig(RCC_PCLK2_Div6);
  60.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  61.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  62.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  63.     ADC_DeInit(ADC1);
  64.     ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  65.     ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  66.     ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
  67.     ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  68.     ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  69.     ADC_InitStructure.ADC_NbrOfChannel = 1;
  70.     ADC_Init(ADC1, &ADC_InitStructure);
  71.    ADC_Cmd(ADC1, ENABLE);
  72.     ADC_ResetCalibration(ADC1);
  73.     while(ADC_GetResetCalibrationStatus(ADC1));
  74.     ADC_StartCalibration(ADC1);
  75.     while(ADC_GetCalibrationStatus(ADC1));
  76. /*LED用定时器TIM2*/
  77.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  78.     NVIC_InitTypeDef NVIC_InitStructure;
  79.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  80.     TIM_TimeBaseStructure.TIM_Period = arr;
  81.     TIM_TimeBaseStructure.TIM_Prescaler =psc;
  82.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  83.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  84.     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  85.     TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE );
  86.     NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
  87.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  88.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  89.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  90.     NVIC_Init(&NVIC_InitStructure);
  91.     TIM_Cmd(TIM2, ENABLE);

    
中断:

  1. void TIM3_IRQHandler(void){
  2.   if( TIM_GetITStatus( TIM3, TIM_IT_Update )!= RESET ){
  3.     TIM_ClearITPendingBit( TIM3, TIM_IT_Update );
  4.         switch(DP){
  5.             case 1:{
  6.                 PD3N=PD2N=PD1N=1;    
  7.                 PD3P=PD2P=PD1P=0;
  8.                 PD1N=PD1P=1;
  9.                 PD2N=PD2P=0;
  10.                 DP=2;
  11.                 break;
  12.             }case 2:{
  13.                 PD3N=PD2N=PD1N=1;    
  14.                 PD3P=PD2P=PD1P=0;
  15.                 PD2N=PD2P=1;
  16.                 PD3N=PD3P=0;
  17.                 DP=3;
  18.                 break;#p#分页标题#e#
  19.             }case 3:{
  20.                 PD3N=PD2N=PD1N=1;  
  21.                 PD3P=PD2P=PD1P=0;
  22.                 PD3N=PD3P=1;    
  23.                 PD1N=PD1P=0;    
  24.                 DP=1;
  25.                 break;
  26.             }
  27.         }
  28.         TIM3->ARR=fz_buf;
  29.   }
  30. }
  31. void TIM4_IRQHandler(void)
  32.   if( TIM_GetITStatus( TIM4, TIM_IT_Update )!= RESET ){
  33.     TIM_ClearITPendingBit( TIM4, TIM_IT_Update );
  34. fz=500+8000*Get_Adc()/4095;
  35.   }
  36. }


主函数只是初始化,其他的不要乱丢到主函数里:

  1. int main(void){
  2.     delay_init();
  3.     NVIC_Configuration();
  4.     init();
  5.     while(1){
  6.         if(Get_Adc()==4095){  //转到头?
  7.             BLUE=1;
  8.         }else{
  9.             BLUE=0;
  10.         }
  11.     }
  12. }


相位图





每次换相中间的绿灯会闪一次,旋转变阻器可以控制速度,不会马上到转到的速度位置,会缓慢加速/减速防止跳子。










录了个视频。背景的啪啦啪啦声音是舍友的机械键盘=-=觉得好吵

 

(责任编辑:admin)
织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
相关文章
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
推荐内容