最近项目中用到Arduino去读取安装在电机背后的光电编码器数值,在低速的时候还好搞定,一旦电机高速运转时,Arduino就来不及用中断去处理事务。于是想到用HCTL-2020来解码的正交信号,但是我一直无法取到值,求指点。
另外想知道Arduino用什么方法可以判断2020的芯片好坏,以及是否正常工作。
还有一点,是我写的代码里,发送时钟信号的设定是否正确。2020用的是14MHz的时钟频率。
哦,对了,忘了说了,上面这个程序,输出值为0,编码器转动时没反应,还是输出0,给我的感觉好像就是这个芯片完全没有起作用,没有任何输出值。
我曾经考虑过,如果这个方案实在走不通的话,就专门用一块328去做解码工作,然后用类似的方式将解码结果输入给主芯片,不知道这种方案可行否,效率和这种专用的芯片相比如何?求指点。
代码如下:
- const int Data_Pins[8] = {30,33,35,37,43,45,47,49};
- int SEL_Pin = 34; //set SEL pin
- int OE_Pin = 36; //set OE pin
- int RST_Pin = 42;
- int CLK_Pin = 32;
- void setup() {
- pinMode (SEL_Pin, OUTPUT);
- pinMode (OE_Pin, OUTPUT);
- pinMode (RST_Pin, OUTPUT);
- // Reset the chip
- digitalWrite(RST_Pin, LOW);
- delay(100);
- digitalWrite(RST_Pin, HIGH);
- pinMode (CLK_Pin, OUTPUT);
- TCCR1A = B01000011; // Fast PWM change at OCR1A
- TCCR1B = B11001; // System clock
- OCR1A = 0; // 8 MHz
- for (int i=0; i<8; i++) {
- pinMode(Data_Pins[i], INPUT);
- }
- pinMode(38, INPUT);
- Serial.begin (9600);
- Serial.print ("Start");
- }
- void loop() {
- unsigned long value = 0;
- // Read the high 8 bits
- digitalWrite(OE_Pin, LOW); // OE = 0
- digitalWrite(SEL_Pin, LOW); // SEL = 0
- delay(100);
- for (int i=0; i<8; i++){
- value = (value << 1) | digitalRead(Data_Pins[i]);
- }
- // Read the low 8 bits
- digitalWrite(SEL_Pin, HIGH); // SEL = 1
- delay(100);
- for (int i=0; i<8; i++){
- value = (value << 1) | digitalRead(Data_Pins[i]);
- }
- digitalWrite(OE_Pin, HIGH); // OE = 1
- Serial.print(digitalRead(38));
- //Serial.print(value, BIN);
- Serial.print(",");
- Serial.println(value, DEC);
- delay(1000); // Keep the data rate reasonable
- }
复制代码
|