磁动力电子网-雕刻机DIY论坛,单片机论坛,CNCDIY,DIYCNC

 找回密码
 加入磁动力

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 13044|回复: 30

[AVR单片机] 制作一款简单的电机调速器

    [复制链接]
发表于 2011-11-17 23:40:12 | 显示全部楼层 |阅读模式
AVR TINY13制作的一款简单的电机调速器
简单的东西,先上图
IMG_20111117_232607.jpg

回复

使用道具 举报

 楼主| 发表于 2011-11-18 10:55:58 | 显示全部楼层
电路原理图
pwm.jpg
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-11-18 21:26:52 | 显示全部楼层
第一版没有保存功能的代码如下
  1. // Cpu ATTiny13
  2. // 频率: 内部9.6000Mhz 不分频
  3. // winavr gcc 优化级别O0
  4. // 明浩 www.cdle.net pnzwzw@163.com
  5. #include<avr/io.h>

  6. #define nop() __asm__ __volatile__("nop") //空语句

  7. unsigned char PWMON;
  8. unsigned char PWMVal;

  9. //IO引脚初始化 
  10. void port_init(void)
  11. {
  12. PORTB = 0x1E;        //PB2\3\4接按键设置为输出上拉
  13. DDRB  = 0x23;        //PB0\1\5为PWM输出 PB1上电置1 PB0上电置0 PB5上电置1
  14. }

  15. //Timer0初始化
  16. //快速PWM模式 频率37.500KHz
  17. void timer0_init(void)
  18. {
  19. OCR0A = 0x00;
  20. TCNT0 = 0x01;                //设计数
  21. TCCR0A = 0x03;                //设置Timer0为快速PWM模式
  22. TCCR0B = 0x01;       
  23. }

  24. //延时毫秒
  25. void delay_ms(void)
  26. {
  27. unsigned char TempCycA;
  28. unsigned char TempCycB;

  29.                 for (TempCycA=0; TempCycA<10; TempCycA++)
  30.                         for (TempCycB=0; TempCycB<90; TempCycB++)
  31.                                 nop();
  32. }

  33. //主函数
  34. int main(void)
  35. {
  36. unsigned int tempval=0;
  37. unsigned int keytime=0;
  38. unsigned int temp=0;

  39. port_init();
  40. timer0_init();

  41. PWMON = 0x01; //初始为PWM开启
  42. PWMVal = 0x00; //第一档
  43. OCR0A = 0x00; //更改占空比
  44. OCR0B = 0x00; //更改占空比

  45. while(1)
  46.         {
  47.        
  48.                 if (!(PINB&0x04))
  49.                         {
  50.                                 keytime = 0;
  51.                                 for (tempval=0; tempval<1001; tempval++)
  52.                                         {
  53.                                                 if (!(PINB&0x04)) //键采样、防抖
  54.                                                         {
  55.                                                                 keytime++;
  56.                                                                 delay_ms();
  57.                                                         }
  58.                                                 else
  59.                                                         break;
  60.                                         }       
  61.                                 if (keytime>1000) //长按1秒则关或开
  62.                                         {
  63.                                                 PWMON = ~PWMON;
  64.                                                 keytime = 0;

  65.                                                 if (PWMON)
  66.                                                         {
  67.                                                                 OCR0A = PWMVal;
  68.                                                                 OCR0B = PWMVal;
  69.                                                                 TCCR0A = 0xB3; //开启PWM
  70.                                                         }
  71.                                                 else
  72.                                                         {
  73.                                                                 TCCR0A = 0x03; //关闭PWM
  74.                                                                 OCR0A = 0x00;
  75.                                                                 OCR0B = 0x00;
  76.                                                         }
  77.                                         }
  78.                                 else
  79.                                         {
  80.                                                 if ((keytime>50)&&(keytime<200)) //短按保存PWM值
  81.                                                         {
  82.                                                         }
  83.                                         }
  84.                         }

  85.                 if ((!(PINB&0x08))&&(PWMON))
  86.                         {
  87.                                 delay_ms();
  88.                                 delay_ms();
  89.                                 delay_ms();
  90.                                 if (!(PINB&0x08))
  91.                                         {
  92.                                                 if (!(PINB&0x10))
  93.                                                         {
  94.                                                                 if (PWMVal!=0x0)
  95.                                                                         {
  96.                                                                                 PWMVal--;
  97.                                                                                 OCR0A = PWMVal; //更改占空比
  98.                                                                                 OCR0B = PWMVal; //更改占空比
  99.                                                                         }
  100.                                                         }
  101.                                                 else
  102.                                                         {
  103.                                                                 if (PWMVal!=0xFF)
  104.                                                                         {
  105.                                                                                 PWMVal++;
  106.                                                                                 OCR0A = PWMVal; //更改占空比
  107.                                                                                 OCR0B = PWMVal; //更改占空比
  108.                                                                         }
  109.                                                         }       
  110.                                                 while(!(PINB&0x08));
  111.                                         }
  112.                         }

  113.                 PINB = (PINB&0x3F); //PB5拉高
  114.                 if (PWMVal>0) //为0时不闪
  115.                         {
  116.                                 if (PWMVal==0xFF) //全速时快闪
  117.                                         temp = 100;
  118.                                 else
  119.                                         temp = 200;
  120.                                 for (tempval=0; tempval<temp; tempval++)
  121.                                         {
  122.                                                 delay_ms();
  123.                                                 if (!(PINB&0x04)) //任一键按下时退出循环
  124.                                                         break;               
  125.                                         }
  126.                         }
  127.                 PINB = (PINB&0x1F); //PB5拉低
  128.         }
  129. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2011-11-19 11:02:17 | 显示全部楼层
朋友出新作了。不错啊
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2011-11-19 11:08:51 | 显示全部楼层
C.rar (9.4 KB, 下载次数: 116, 售价: 1 ¥金钱)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-11-22 10:51:05 | 显示全部楼层
发个测试视频


回复 支持 1 反对 0

使用道具 举报

发表于 2011-11-22 15:48:46 | 显示全部楼层
能不能开发个成品板啊?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-11-22 16:51:16 | 显示全部楼层
可以,有空就搞个PCB
回复 支持 反对

使用道具 举报

发表于 2011-11-22 20:35:39 | 显示全部楼层
那就快搞 呀~~~~~~~~~~
回复 支持 反对

使用道具 举报

发表于 2011-11-22 20:40:38 | 显示全部楼层
那就快搞呀~~~~~~~~~
回复 支持 反对

使用道具 举报

发表于 2011-11-25 14:43:55 | 显示全部楼层
用的啥电位器呢,调那么多圈,嘿嘿!
回复 支持 反对

使用道具 举报

发表于 2011-11-27 20:05:53 | 显示全部楼层
好东东,可惜AVR不会玩,就玩玩51
回复 支持 反对

使用道具 举报

发表于 2011-11-28 00:40:08 | 显示全部楼层
實在很高興!可以看到這麼好的知識!謝謝分享!!
回复 支持 反对

使用道具 举报

发表于 2011-12-2 06:36:22 | 显示全部楼层
下载看看,谢谢!
回复 支持 反对

使用道具 举报

发表于 2012-3-17 02:20:55 | 显示全部楼层
多謝樓主 無私奉獻
回复 支持 反对

使用道具 举报

发表于 2012-4-29 14:43:21 | 显示全部楼层
明浩兄的pcb搞好了吗?
回复 支持 反对

使用道具 举报

发表于 2012-5-23 14:25:44 | 显示全部楼层
有没有可以用旋钮调步电机角度的呢?或减速电机角度的?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-5-23 14:29:15 | 显示全部楼层
ZNQL5416 发表于 2012-5-23 14:25
有没有可以用旋钮调步电机角度的呢?或减速电机角度的?

做过类似的
回复 支持 反对

使用道具 举报

发表于 2012-5-24 07:55:21 | 显示全部楼层
那就可以做一个遥控手臂玩了。{:soso_e113:}能上个图不?
回复 支持 反对

使用道具 举报

发表于 2012-5-24 22:02:47 | 显示全部楼层
好,用51玩过。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入磁动力

本版积分规则

QQ|小黑屋|手机版|Archiver|www.cdle.net 磁动力电子网 2001-2017 ( 粤ICP备10098153号

粤公网安备 44040402000001号

GMT+8, 2019-3-26 14:52

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.