查看: 820|回复: 5

基于attiny13a的无刷小风扇

[复制链接]

该用户从未签到

发表于 2022-6-3 18:41 | 显示全部楼层 |阅读模式
本帖最后由 希岩 于 2022-6-3 18:52 编辑

之前在学校用小型单片机做了一个小风扇,在夏天总算可以凉快凉快了。整个方案非常简单,就是电池+控制器+无刷电调+无刷电机。

电机转速很高,使用的是无刷电机,无刷电机需要一个驱动器,这里我们拿一个1s-2s最大电流10A的电调就行。

原理

原理

电机我这里选的是1104电机,400kv。
视频见我的哔哩哔哩视频,感兴趣可以关注忆创电子【淘宝】

attiny13a的源码贴在这里了,编译平台是iccavr。

  1. //注意将option中target选为attint13A


  2. #include<iot13Av.h>
  3. #include<AVRdef.h>

  4. unsigned char button_cnt=0;
  5. unsigned int u16temp;
  6. unsigned char   T0count;
  7. //#define CAL
  8. #define LOW_SPEED    53
  9. #define HIGH_SPEED   144
  10. //初始化定时器------------------------------------------------------------
  11. #pragma interrupt_handler PCINT_ISR:3    //定时器声明,计数器比较器TIN0A
  12. void PCINT_ISR(void)
  13. {
  14.     // GIFR|=0x20;  //清中断
  15.     if(PINB&0x10)
  16.     {
  17.         button_cnt ++;
  18.         PINB |= 0x04;
  19.     }
  20. }


  21. void Init_TIMER0(void)
  22. {
  23.     TCCR0A=0;                                //普通方式
  24.     TCCR0B=0b00000011;                            //预分频64,计时75kHz
  25. }
  26. void Init_PWM(void)
  27. {
  28.     TCCR0A=0b00100011;                    //普通方式
  29.     TCCR0B=0b00000011;                               //预分频64,计时75kHz
  30.     OCR0B=LOW_SPEED;                        //频率293Hz,当前1.9ms
  31. }
  32. //初始化控制器------------------------------------------------------------------
  33. //初始化时钟-------------------------------------------------------------------
  34. void Init_Clock(void)
  35. {
  36.     OSCCAL = 0x5C;                 //时钟矫正至4.8Mhz,page22
  37.     //OSCCAL = 0x5D;                 //时钟矫正至9.6Mhz,page22
  38.     //CLKPR  = 0x80;                 //时钟分频器使能CLKPR_CLKPCE
  39.     //CLKPR  = 0x00;                 //系统时钟8分频,p24(0>1;1>2;...8>256)
  40. }

  41. //-----------------------------------------------------------------------
  42. void Init_Port(void)
  43. {
  44.     DDRB   = 0x06;
  45.     PORTB  = 0x00;                 //PB1设为输出,其它为输入
  46.     PORTB |= 0x04;
  47. }
  48. void Init_Pcint(void)
  49. {
  50.     DDRB &= ~0x10;
  51.     PORTB &= ~0x10;
  52.     GIMSK |= 0x20;  //中断使能
  53.     PCMSK = 0x10;   //PB4 中断使能
  54. }
  55. //--------------------------------------------------------------------------
  56. //选择内部标定的RC振荡器4.8MHz
  57. void Init_devices(void)
  58. {
  59.     Init_Clock();
  60.     Init_Port();
  61.     Init_TIMER0();
  62. }

  63. //延时函数1ms----------------------------------------------------------------
  64. void delayms(unsigned int deftime)
  65. {
  66.     for(u16temp=0; u16temp<deftime; u16temp++)
  67.     {
  68.         T0count=TCNT0;
  69.         while((TCNT0-T0count)<74)
  70.         {
  71.             WDR();
  72.         }
  73.     }
  74. }
  75. //延时函数----------------------------------------------------------------
  76. void delay_some(void)
  77. {
  78.     char j;
  79.     for(j=0;j<255;j++) WDR();
  80.     for(j=0;j<255;j++) WDR();
  81. }
  82. // -----------------------------------------------------------------------------
  83. void main(void)
  84. {
  85.     char i;
  86.     CLI();                       //清中断
  87.     Init_devices();              //初始化设备

  88.     delayms(1000);
  89.     Init_PWM();
  90.     Init_Pcint();
  91.     #ifdef CAL
  92.     OCR0B=HIGH_SPEED;                        //频率293Hz,当前1.9ms
  93.     delayms(2100);
  94.     OCR0B=LOW_SPEED;      //0.7ms代表油门最低,1.9ms代表最高
  95.     delayms(500);
  96.     #endif

  97.     // delayms(500);
  98.     PORTB&= ~0x04; //LED off
  99.     /*
  100.     for(i=0;i<60;i+=2)
  101.     {
  102.         OCR0B=LOW_SPEED+i;
  103.         delayms(20);
  104.     }

  105.     OCR0B=52;
  106.     */
  107.     SEI();                       //中断使能

  108.     while(1)
  109.     {
  110.         switch(button_cnt%5)
  111.         {
  112.           case 0:
  113.               OCR0B=LOW_SPEED-1;
  114.           break;

  115.           case 1:
  116.               OCR0B=LOW_SPEED+22*1;
  117.           break;

  118.           case 2:
  119.           for(i=0;i<23;i++)
  120.           {
  121.               OCR0B=LOW_SPEED+22+i;
  122.               delay_some();
  123.           }
  124.           break;

  125.           case 3:
  126.           for(i=0;i<23;i++)
  127.           {
  128.               OCR0B=LOW_SPEED+22*2+i;
  129.               delay_some();
  130.           }
  131.           break;

  132.           case 4:
  133.           for(i=0;i<23;i++)
  134.           {
  135.               OCR0B=LOW_SPEED+22*3+i;
  136.               delay_some();
  137.           }
  138.           PORTB &= ~0x04;
  139.           break;

  140.           default:break;
  141.         }
  142.         WDR();
  143.     }
  144. }
  145. ////////////////////////////////////////////////////////////////////////////////
  146. //This is END.
复制代码




该用户从未签到

发表于 2022-6-3 20:46 | 显示全部楼层
电调没有上电油门检测?

签到天数: 6 天

[LV.2]偶尔看看I

发表于 2022-6-3 21:05 | 显示全部楼层
作者你好,请问你用的是怎样的电调,有具体型号吗?

该用户从未签到

发表于 2022-6-3 22:02 | 显示全部楼层
看成用 TINY13 自制电调了.....

该用户从未签到

 楼主| 发表于 2022-6-8 09:20 | 显示全部楼层
t3486784401 发表于 2022-6-3 22:02
看成用 TINY13 自制电调了.....

attiny13做不了无刷电调,有刷电调倒是可以

该用户从未签到

发表于 2022-6-8 15:19 | 显示全部楼层
希岩 发表于 2022-6-8 09:20
attiny13做不了无刷电调,有刷电调倒是可以

开环的 28byj 勉强能带一带;做带霍尔的三相电调,理论上 6 个 io 三进三出......
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门推荐

Arduino IDE助手,【支持中文代码】和自动完成
Arduino IDE助手,【支持
最近在学习arduino,发现代码框不支持自动完成列表,故做了这个辅助编辑器。支持中文
【干货分享】mega2560原理图PCB图纸altium designer18
【干货分享】mega2560原理
分享一下mega2560的板子 AD版本 **** 本内容被作者隐藏 **** ergo
【花雕动手做】有趣好玩音乐可视化(14)---水杯水瓶灯
【花雕动手做】有趣好玩音
偶然心血来潮,想要做一个声音可视化的系列专题。这个专题的难度有点高,涉及面也比较
求大佬指导气流传感器怎么编代码呢
求大佬指导气流传感器怎么
新手求助!端口不显示的问题
新手求助!端口不显示的问
我的板子连到电脑上没有显示端口,试过安装ch340和驱动精灵都识别不出来,数据线也换
Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
快速回复 返回顶部 返回列表