2017-11-24 1 views
0

그래서 STM32 프로젝트에서 메뉴를 제어하기 위해 로터리 엔코더를 사용하려고합니다. 두 개의 로터리 엔코더를 사용하여 화면의 각면을 제어합니다 (분할 메뉴).TIMx ARR 값을 선택한 값으로 초기화하도록 설정할 수 있습니까?

엔코더의 펄스를 계산하는 두 타이머의 ARR 레지스터를 초기화 할 때 레지스터를 0으로 초기화하고 카운터를 시계 반대 방향으로 움직이면 레지스터가 오버플로되고 65535의 최대 값으로 이동하여 내 코드가 멈춤을 계산하는 방법.

TIM-> CNT 값을 0에서 65535 사이의 중간에 사용자 정의 값으로 설정하는 방법이 있는지 말해 줄 수 있습니까? 이렇게하면 값 사이의 차이를 쉽게 확인하고 숫자의 점프에 대해 걱정하지 않아도됩니다.

+0

모듈 식 산술 연산이 카운터의 범위와 일치 할 때 차이가 발생합니다.이 경우 16 비트 정수로 뺄셈을 수행합니다. 그 사이의 총 변화가 -32768에서 +32767을 초과하지 않는다고 가정하면'(int16_t) (new_count - old_count)'는 두 샘플 간의 차이를 계산합니다. – doynax

+0

정확히 처음 코드를 작성했을 때 생각했던 것입니다.하지만 0 부근에서 일관성없는 동작을 발견했습니다. 어떤 이유로 든 TIM-> CNT에서 음수 값을 가져올 수 없으므로 가능한 가장 큰 값으로 이동합니다. 변수가 부호있는 정수인지 확인했습니다. –

답변

1

인코더를 시계 반대 방향으로 움직이면 레지스터가 오버플로되고 65535의 최대 값으로 이동하고 내 코드가 멈춤을 계산하는 방법이 엉망이됩니다.

카운터는 32 비트 부호없는 레지스터에 넣은 16 비트 값입니다. 적절한 부호있는 값을 얻으려면 int16_t으로 전송하십시오.

int wheelposition = (int16_t)TIMx->CNT; 

65535 (0xFFFF가)의 값은 32 비트 정수 변수 -1로 해석을 0xFFFFFFFF까지 부호 확장된다. 하지만 문제는 -32768에서 +32767로 넘칠 것입니다.

두 위치 판독 값의 부호가있는 차이점에 관심이 있다면 부호없는 값에서 빼기를 수행하고 그 결과를 int16_t으로 전송할 수 있습니다.

uint32_t oldposition, newposition; 
int wheelmovement; 
oldposition = TIMx->CNT; 
/* wait a bit */ 
newposition = TIMx->CNT; 
wheelmovement = (int16_t)(newposition - oldposition); 

16 비트 오버플로를 고려한 부호있는 차이가 있습니다.

은 TIM-> CNT 값을 0에서 65535 사이의 중간에 맞춤 값으로 설정하는 방법은 무엇입니까?

임의의 값을 TIMx->CNT에 할당 할 수 있습니다.이 값은 계속해서 계산됩니다.

+0

TIMx-> CNT를 설정하면 문제가 해결되었습니다! 고맙습니다. 어떤 이유로 든 음수 값을 부호있는 정수로 변환 할 수 없습니다. 그러나 제로에서 멀리 떨어져 있으면 괜찮을 것이고, 누군가가 32K 펄스를 지나기 위해 인코더를 충분히 멀리 돌릴 방법은 없습니다. 또한 내 마이크로 컨트롤러에서 ARR은 STM32L152RCT6을 사용할 때 16 비트 레지스터입니다. –

관련 문제