지난번 STM32의 타이머 인터럽트를 이용하여 PWM의 주기를 펄스마다 변경하는 로직을 만들었다.
결론은 STM32F103RCT6를 사용하면 최대 50KHz의 안정적인 인터럽트를 발생시킬 수 있고 모토가 탈조를 일으키지 않고 최대로 구동할 수 있는 주파수는 5.8KHz까지 였다.
그러나 오늘은 스텝모터에 가감속 테이블을 이용하여 제어하여 보다 높은 주파수까지 제어해보았다.
스텝모터는 스루영역에서 가감속테이블을 사용하면 훨씬 더 높은 주파수까지 구동이 가능하다.
가감속테이블은 시간의 sqrt 함수에 대한 응답을 테이블로 만들어서 간략하게 적용해보았다. 스텝수는 512개 사용하였고, 테이블의 값의 의미는 가변주기 펄스를 만들기위한 Prescaler의 값이다.
펄스가 끝나는 타이머인터럽트에서 펄스의 개수를 카운트하고, 카운트 값에 해당하는 테이블의 값을 일어와서 다음 펄스를 만드는 Prescaler 레지스터에 넣어주었다. Prescaler의 값은 3600 부터 340까지의 값을 가진다. 3600일때 1KHz 노말 구동이고, 340 은 최대속도인 약 10.6KHz 이다.
아래 사진은 700us 즉 1.4KHz 정도의 가감속하지 않은 속도를 나타내고 있다. 1Khz보다는 속도가 약간 높다.
아래 사진은 약 94us 정도의 주기를 가지니 최대속도인 10.5KHz의 펄스를 보여주고 있다.
아래는 가감속 테이블을 사용하여 스텝모터를 구동해보았다.
가감속제어는 외부 GPIO를 할당하여 High일때 타이머인터럽트에서 가감속 테이블을 적용하게 하였다. GPIO가 High로 edge 트리거 되는 순간 512개의 펄스는 가속테이블값을 읽어와서 펄스를 가변하여 최대속도인 10.5KHz까지 올라간다. High 상태가 유지되다가 Low로 edge 트리거 되는 순간 다시 512개의 가속 테이블을 역순으로 읽어와서 감속과정을 수행한다.
결론은 가감속 테이블을 사용할 경우 그냥 선형적 제어를 하는 것보다 훨씬 높은 주파수까지 제어가 가능했다.
'엔지니어링 > 임베디드' 카테고리의 다른 글
리눅스에 Boost 라이브러리 설치 (0) | 2019.11.15 |
---|---|
[라즈베리파이] Ubuntu에서 크로스 컴파일 환경설정 및 예제코드작성 (0) | 2019.11.14 |
IMU MEMS 센서 MPU6050 살펴보기 1 - 자이로 센서 (0) | 2019.10.27 |
IMU MEMS 센서(Gyroscope + Accelerometer) (3) | 2019.10.27 |
[아두이노 기초교육] Visual Studio for Arduino 설치 및 개발 환경설정 (0) | 2019.10.22 |
댓글