一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
楼主: junyee
收起左侧

[其他DIY] 我做的STM8 的 T12控制器

[复制链接]
发表于 2014-12-13 00:45 | 显示全部楼层
我也在困惑为什么t12要用pid控制,哪位前辈出来扫盲一下?
发表于 2014-12-13 09:54 | 显示全部楼层
http://pan.baidu.com/s/1sjLQTRZ pid相关资料

哈哈 我也是看别人用pid自己也跟着用的.
如果调整好应该是恒温更平滑, 变温时回升更快.
但调整的不好就回温更慢 恒温时也未必稳定 也可能回温快 但是过冲很大.
从实用角度说未必能有啥实际使用效果 只是心里觉着nb而已 就跟烙铁芯温度在+-10度变化未必会真的影响焊接一样
如果按温差比例控制加热大小基本也就差不多了也就是只用P

点评

没错,对于T12,用P调节器很多时候可以了,要求高就加上I,D基本没什么用,大多数时候在捣乱。不过如果照搬PID,效果好不了。。  发表于 2014-12-16 22:49
赞同!  发表于 2014-12-15 17:23
发表于 2014-12-13 10:29 | 显示全部楼层
正在看STM8教程,等代码学习一下
发表于 2014-12-13 11:48 | 显示全部楼层
junyee 发表于 2014-12-12 15:12
不知道啊,
在学习PID,看得是一头雾水啊.

我试过PID了 效果一般般 代码却很复杂
 楼主| 发表于 2014-12-13 17:08 | 显示全部楼层
金向维 发表于 2014-12-13 11:48
我试过PID了 效果一般般 代码却很复杂

呃,正好PID看得我头痛痛,似懂非懂。。。

还是先不搞PID。
先把代码写好。


 楼主| 发表于 2014-12-13 17:15 | 显示全部楼层
本帖最后由 junyee 于 2014-12-13 17:17 编辑
goodcode 发表于 2014-12-13 09:54
http://pan.baidu.com/s/1sjLQTRZ pid相关资料

哈哈 我也是看别人用pid自己也跟着用的.

今天碰到一个大问题。。
是关于编码器的。

GOOGCODE 的 STC控制器,在使用过程中,发现在旋转过快时会反向操作,有时心急,转得过快,反而往反方向加/减温度了,很是不爽。原来以为是goodcode的代码有问题(估计是定时检测编码器状态,刷新速度跟不上来。)

于是,我用了STM8的 外部中断,正好其有个 下降沿触发 中断的功能。

编码器 接在 PA2,PA3 (10K上拉)上。
只要PA3触发下降沿中断时,检测PA2是高、低电平即可解码。
这样的话,代码实在是太简单了。

在调试过程中,发现这毕竟只是理论。可能是STM8太灵敏或者抖动的原因.
在一次拨动操作过程中会产生数次中断,而这几次中断会导致多次误码。
花了点时间,写了个工具,分析 整个端口电平变化的。
6.jpg

这样看电平变化就一目了然了.

真是到处碰壁,要把代码写好看来还得花一番工夫。。。。



发表于 2014-12-13 17:19 | 显示全部楼层
junyee 发表于 2014-12-13 17:15
今天碰到一个大问题。。
是关于编码器的。

机械开关都要防抖动的
 楼主| 发表于 2014-12-13 17:24 | 显示全部楼层
本帖最后由 junyee 于 2014-12-13 17:25 编辑
kazuyuki 发表于 2014-12-13 17:19
机械开关都要防抖动的

是的啊.

不想做傻傻的 delay,
用了定时器4,延时.
发现这个误差好多了,仍然存在.

增加延时,误码减少,但容易丢帧(尤其是高速旋转编码器时).减小延时,误码又来了.


刚看了下,跟编码开关也有一点关系.

现在在根据 端口状态转换出来的波形图,看是否有巧妙的办法避免这种错误.

发表于 2014-12-14 22:35 | 显示全部楼层
  1. #include "config.h"
  2. #include "rotaryencoder.h"

  3. #ifndef __DEBUG_MODE__
  4. bit prevEncoderA, prevEncoderB, prevEncoderD;  //上一次编码器开关的状态
  5. //编码器按键统计
  6. unsigned int KeyDDownTime;

  7. void InitEncoder(void)
  8. {
  9.         /*功能: 初始化旋转编码开关*/
  10.         //IT0 = 0;                          //设置 INT0 的中断触发方式 (1:Falling only 0:Rising & Falling)
  11.         //EX0 = 1;                          //允许INT0 中断
  12.         //设置端口为仅为输入(高阻)
  13.     P3M1 = P3M1 | 0x0C;
  14.         P1M1 = P1M1 | 0x10;

  15.         prevEncoderA = 1;
  16.         prevEncoderB = 1;
  17.         prevEncoderD = 1;
  18.         KeyDDownTime = 0;
  19. }

  20. unsigned char EncoderPress(void)
  21. {
  22.         /*功能: 检测旋转编码器状态*/
  23.         unsigned char result = ENCODER_NONE;

  24.         //ENCODER_A = 1;
  25.         //ENCODER_B = 1;
  26.         //ENCODER_D = 1;
  27.         //_nop_();
  28.         //_nop_();
  29.         if(prevEncoderA == 1)
  30.         {
  31.                 if (ENCODER_A == 0)
  32.                 {
  33.                         //INT0=0(下降沿Falling ) 编码器 ON
  34.                         prevEncoderB = ENCODER_B; //保存当前B端口状态       
  35.                 }
  36.         }
  37.         else
  38.         {
  39.                 //INT0=1(上升沿Rising) 编码器 OFF
  40.                 if (ENCODER_A == 1)
  41.                 {
  42.                         if (ENCODER_B)
  43.                         {
  44.                                 //顺时针方向
  45.                                 if (prevEncoderB == 0)
  46.                                 {
  47.                                         result = ENCODER_CW;
  48.                                 }       
  49.                         }
  50.                         else
  51.                         {
  52.                                 //逆时针方向
  53.                                 if (prevEncoderB)
  54.                                 {       
  55.                                         result = ENCODER_CCW;
  56.                                 }
  57.                         }
  58.                 }       
  59.         }
  60.         prevEncoderA = ENCODER_A; //保存当前开关A的状态

  61.         //检测编码开关按键
  62.         if (ENCODER_D)
  63.         {
  64.                 //高电平
  65.                 if(!prevEncoderD)
  66.                 {
  67.                         //上升沿
  68.                         if (KeyDDownTime > SHORT_KEY_DOWN_COUNT)
  69.                         {
  70.                                 result = ENCODER_SHORT_DOWN;       
  71.                         }
  72.                 }
  73.         }
  74.         else
  75.         {
  76.                 //低电平
  77.                 if (prevEncoderD)
  78.                 {
  79.                         //下降沿
  80.                         KeyDDownTime = 1; //清零按下计数器
  81.                 }
  82.                 else
  83.                 {
  84.                         //增加按键按下计数器值
  85.                         if (KeyDDownTime > 0)
  86.                         {
  87.                                 KeyDDownTime++;
  88.                                 if (KeyDDownTime > LONG_KEY_DOWN_COUNT)
  89.                                 {
  90.                                         //按键长按下触发
  91.                                         result = ENCODER_LONG_DOWN;
  92.                                         KeyDDownTime = 0; //清零计数器, 使长按键与短按键不再触发
  93.                                 }
  94.                         }
  95.                 }
  96.                 //reslut = reslut & ENCODER_KEY_DOWN; //设置按键按下标志位
  97.         }  
  98.         prevEncoderD = ENCODER_D; //保存当前开关D的状态

  99.         return result;
  100. }

  101. unsigned char EncoderKeyDown(void)
  102. {
  103.         /*功能: 检测旋转编码开关的按键是否按下, 如果按下等待释放后再返回*/
  104.         unsigned char result = 0;
  105.         //ENCODER_D = 1;
  106.         //_nop_();
  107.         //_nop_();

  108.         if (!ENCODER_D)
  109.                 result = 1;
  110.         while(!ENCODER_D) //等待按键释放
  111.                 delayms(10);
  112.         return result;
  113. }

  114. //External interrupt0 service routine
  115. /*void exint0() interrupt 0             //中断0 (向量地址 0003H)
  116. {
  117.         if (ENCODER_A)
  118.         {
  119.                 //INT0=1(上升沿Rising) 编码器 OFF
  120.                 ENCODER_B = 1;
  121.                 _nop_();
  122.                 _nop_();
  123.                 if (ENCODER_B)
  124.                 {
  125.                         //顺时针方向
  126.                         if (prevEncoderB == 0)
  127.                         {
  128.                                 KeyPress( ENCODER_CW);
  129.                         }       
  130.                 }
  131.                 else
  132.                 {
  133.                         //逆时针方向
  134.                         if (prevEncoderB)
  135.                         {       
  136.                                 KeyPress( ENCODER_CCW);
  137.                         }
  138.                 }
  139.         }
  140.         else
  141.         {
  142.                 //INT0=0(下降沿Falling ) 编码器 ON
  143.                 ENCODER_B = 1;
  144.                 _nop_();
  145.                 _nop_();
  146.                 prevEncoderB = ENCODER_B; //保存当前B端口状态
  147.         }  
  148. }*/

  149. #endif //__DEBUG_MODE__
复制代码
  1. /*
  2. 功能: EC11 型旋转编码开关

  3. 端口
  4. A  P3.2 INT0
  5. B  Gnd
  6. C  P1.4 (可变更)
  7. D  P3.3 INT1
  8. E  Gnd

  9. ***注:
  10. 当前使用204EA为A版 "A版本的外部中断有时会异常,B版本的外部中断可正常使用"
  11. 已测试外部中断会导致MCU死锁, 所以只能使用轮训方式
  12. */
  13. #ifndef __ROTARYENCODER_H__
  14. #define __ROTARYENCODER_H__

  15. sbit ENCODER_A = P3^2;
  16. sbit ENCODER_B = P1^4;
  17. //sbit ENCODER_A = P3^4;
  18. //sbit ENCODER_B = P1^2;

  19. sbit ENCODER_D = P3^3;

  20. //顺时针方向
  21. #define ENCODER_CW 0
  22. //逆时针方向
  23. #define ENCODER_CCW 1
  24. //按键短按
  25. #define ENCODER_SHORT_DOWN 2
  26. //按键长按
  27. #define ENCODER_LONG_DOWN 3
  28. //按键按下标志
  29. #define ENCODER_KEY_DOWN 0x80
  30. //无操作
  31. #define ENCODER_NONE 0x40

  32. #ifndef __DEBUG_MODE__
  33. void InitEncoder(void);
  34. unsigned char EncoderPress(void);
  35. unsigned char EncoderKeyDown(void);
  36. #endif //__DEBUG_MODE__
  37. #endif
复制代码
我这也是在定时器里刷新的 也不咋地

发表于 2014-12-15 00:44 | 显示全部楼层
估计就是goodcode的原码消失了

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-3-29 16:06 , Processed in 0.050167 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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