|
|

楼主 |
发表于 2016-11-24 12:21:45
|
显示全部楼层
谢谢您的指导,真是太感谢了!
我原来的思路是用定时中断产生CLK的周期脉冲,而您的程序是用for循环+delay来产生脉冲,我没有想到。
按您的思路我重新编写了程序:
- int pinCLK = 12; // 时钟
- int pinCSn = 10; // 使能
- int pinD0 = 9; // 资料
- unsigned int valueTmp = 0;
- unsigned int value = 0;
- void setup()
- {
- Serial.begin(9600);
- pinMode(pinCLK, OUTPUT);
- pinMode(pinCSn, OUTPUT);
- pinMode(pinD0, INPUT);
-
- // 用定时器2定时中断,采用比较匹配输出模式,CTC模式,NORMAL port operation
- TCCR2A = 1 << WGM21;
- TCCR2B = 1 << CS22 | 1 << CS21 | 1 << CS20; // 内部时钟,1024分频(16M/1024 = 15625),CTC模式
- TCNT2 = 0x00; // 初始化计数值
- /*
- 15625/100Hz(10ms) = 156.25 = 156
- */
- OCR2A = 0x9B; // OCR2A = 0x9B(155) ,(155+1)*(1/15625) = 10ms,也就是定时中断的周期是10ms
-
- TIMSK2 |= (1 << OCIE2A); // 允许定时器比较匹配中断
- }
- void loop()
- {
- delay(1000);
- getPosition(); // 取得编码器当前角度值
- }
- // 中断
- ISR(TIMER2_COMPA_vect)
- {
- cli(); // 停止中断
- valueTmp = 0;
- digitalWrite(pinCSn, HIGH);
- digitalWrite(pinCLK, HIGH);
- delayMicroseconds(1); // 延时1us
- digitalWrite(pinCSn, LOW);
- delayMicroseconds(1); // 延时1us
- digitalWrite(pinCLK, LOW);
- delayMicroseconds(1); // 延时1us
- digitalWrite(pinCLK, HIGH);
- // 读取角度资料
- for(int i=0; i < 10; i++)
- {
- delayMicroseconds(1);
- digitalWrite(pinCLK, LOW);
- valueTmp <<= 1;
- valueTmp |= digitalRead(pinD0);
- digitalWrite(pinCLK, HIGH);
- }
- value = valueTmp;
- // 接着读状态能资料
- for(int i=0; i<6; i++)
- {
- delayMicroseconds(1);
- digitalWrite(pinCLK, LOW);
- valueTmp <<= 1;
- valueTmp |= digitalRead(pinD0);
- digitalWrite(pinCLK, HIGH);
- }
- digitalWrite(pinCLK, HIGH);
-
- sei(); // 允许中断
- }
- // 获取角度值
- void getPosition()
- {
- int i;
- float angle = 0.0;
- unsigned int x = value;
-
- // 将二进制格雷码转换成二进制编码
- for (i=0; (1<<i)<sizeof(x)*8; i++)
- {
- x^=x>>(1<<i);
- }
- angle = 360.0 * x / 1024;
- Serial.println(angle);
- }
复制代码
这回能读到0~360°的角度值了,但是还是有问题!!!
如下:
1. 数据不稳定,如下图,有波动,按说明书上的写,应该很稳定;
2. 我尝试向一个方向转动编码器(从编码器尾部看是逆时针转动编码器),数据不连续,如下图,我只转动很小的角度,却一下从125°跳到349°;
3. 再转动,又从349跳到288
4. 我是向一个方向转动的编码器,可是数据一会减、一会增,如下两图:
---------------------------------------------------------------
我觉得程序还有小问题,但不大,您还能帮帮我么? |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|