로터리 엔코더를 돌리면서 lcd 값을 보면
어떤 부분에서 방송주파수는 변하는 데 dac 로 가는 값은 변하지 않는 것을 보았습니다.
보안관님 설명으로는 정수 계산에서의 문제라고 했는데.
아마도
엔코더 입력->주파수 변경->dac 값 계산
의 순서로 진행되나 봅니다.
그 과정에서 정수 계산이 딱 떨어 지지 않는 부분에서
8 bit 의 한계가 나온다는 설명으로 들립니다.
찬찬히 계산해 보면
88MHz-108MHz 사이에 200KHz 대역폭이므로
FM 방송 채널은 100 개 입니다.
따라서
엔코더 변수 를
unsigned char ucEncoder1to100;
로 정하고 엔코더 회전에 따라 1에서 100 사이의 값만을 가지면 됩니다.
그 다음에 이 값를 가지고
FMchannel = funcFM (ucEncoder1to100) ;
을 하면 방송선택이 될 것입니다.
(구체적으로 어떤 값을 어떻게 보내는 지 모르므로 단순히 함수 선언했습니다.)
----------------------------------------------
DACout = (ucEncoder1to100 -1) * 2;
하면 0 에서 198 의 값을 가지게 됩니다.
굳이 0-255의 값을 가져야 할 필요는 없습니다만.(어차피 full scale 을 조정해야 하므로)
DACout = (unsigned char) ( ( ( (unsigned int)ucEncoder1to100 -1)* 257)/100 ) ;
하면
(unsigned int)ucEncoder1to100 -1 에서 0-99 의 값을 갖고
( ( (unsigned int)ucEncoder1to100 -1)* 257) 에서 0-25443 의 값을 가지므로
DACout 값은 0-254 의 값을 갖게 됩니다.
따라서
먼저 엔코더 입력을 ucEncoder1to100 변수에 반영하고 나서
그 값으로 방송과 dac 값을 변경하게 하면
방송 주파수는 변하는 데 dac 값이 변경하지 않는
(결국 메타 지시바늘이 움직이지 않는)
bug 가
발생하지 않을 것입니다.
--------------------------------------
ucEncoder1to100 는 굳이 1에서 100 까지의 값이 아니라
0-99 의 값을 가져도 아무 문제가 없습니다만.
나중에 eeprom 에 저장하는 경우를 생각해서
eeprom 이 초기화 되는 경우에 (erase 등) 0x00 이거나 0xFF 값을 갖게 되므로
0 이 아닌 값이면 저장된 값이라는 의미로서 1 부터 시작하는 것으로 정해 보았습니다.
첫댓글 좋은 글 감사합니다. 전혀 문제 없이 수정되었습니다.
long 값으로 정수계산 후에 반영하였습니다.
87.9 - 108.1 주파수를 풀 스윙합니다.
Fwanted - 879
------------ x 255
202
879 (0) -- 1081 (255)