Skip to main content

Posts

Showing posts from September, 2018

STM32F103C8T6, #4 TIMER INTERRUPT

Timer là bộ định thời, cứ sau một khoảng thời gian định trước thì bộ định thời sẽ phát ra một sự kiện để bạn có thể thực hiện các tính toán định kỳ theo ý muốn. Cách sử dụng timer trong STM32F103C8T6 1. Chọn TIM1, SYS/Debug là Serial Wire, bật USART như hình dưới 2. Bên tab configuration chọn TIM1 và thiết lập Prescale là (4000-1) tức là 3999, viết 4000-1 thì dễ hiểu hơn (xem phần công thức tính phía dưới để biết tại sao). Thiết lập Counter Period là 2000-1. 3. Bật trigger cho UART và Timer 4. Công thức tính khoảng thời gian mà timer lặp lại như sau: Update_event = TIM_CLK / ((PSC+1)*(ARR+1)*(RCR+1)) Trong đó TIM_CLK là tần số xung của timer, trong ví dụ ở hình dưới thì clock này là 8MHz. PSC là Prescale ở bước trên 4000-1 ARR là autoreload register, là Counter Period ở hình trên, giá trị là 2000-1 RCR là repetition counter, như hình trên thì giá trị là 0 Như vậy với thiết lập chúng ta đang có thì 8000000/(4000*2000*1) = 1s. Nghĩa là cứ 1s thì timer sẽ trigge

STM32F103C8T6, #3 ADC

ADC tiếng anh là Analog-to-digital converter, tức là chuyển từ tín hiệu tương tự sang tín hiệu số. Ví dụ ADC 12 bit có giá trị trong vòng 0 - 4096, với mức đo hiệu điện thế từ 0 -3.3V chẳng hạn. Khi đó nếu 0V thì đọc giá trị digital sẽ là 0, nếu 3.3V thì đọc giá trị sẽ là 4096, nếu 1.65V thì sẽ có giá trị 2048,... Ứng dụng ADC để đo các đại lượng analog như nhiệt độ, độ sáng... Chẳng hạn cặp nhiệt K (K-type thermal couple), khi nhiệt độ thay đổi thì hiệu điện thế hai đầu cặp nhiệt sẽ thay đổi. Lúc đó có thể dùng bộ ADC để đọc giá trị thay đổi rồi dựa vào đó điều khiển thiết bị. Để sử dụng ADC trên STM32F103C8T6 thực hiện các bước như sau: 1. Tạo dự án mới trong STM32CubeMX, chọn IN3 trong ADC1, chọn Asynchronous cho USART1, ngoài ra cần chọn Serial Wire cho mục SYS/Debug, và chọn chân PC13 là GPIO_Output để tắt bật đèn LED nếu cần. 2. Trong tab Configuration, chọn NVIC và bật các ngắt như hình dưới 3. Để bắt đầu đọc tín hiệu analog thì cần gọi hàm HAL_ADC_Start_IT(&

STM32F103C8T6, #2 DIGITAL GPIO

GPIO là viết tắt của General Purpose Input Output, hiểu nôm na là cổng nhập / xuất. Nhập có nghĩa là đọc tín hiệu vào, với chân digital thì tùy vào mức vôn gần với 0V hay gần với 3.3V mà sẽ trả về trạng thái là CAO hay THẤP. Ứng dụng để đọc trạng thái đầu vào, ví dụ đọc trạng thái của nút nhấn chẳng hạn. Xuất có nghĩa là đưa tín hiệu ra, với chân digital thì ví dụ nếu lệnh xuất ra tín hiệu mức CAO lúc đó đo vôn ở chân tín hiệu là ~3.3V, nếu xuất ra tín hiệu mức THẤP thì đo vôn là ~0V. Ứng dụng để điều khiển các thiết bị ngoại vi, chẳng hạn để bật tắt đèn hay bật tắt một thiết bị nào đó khác. Như vậy Digital GPIO có hai mức là CAO hoặc THẤP, hay 1 hoặc 0 tùy theo cách gọi. Một số lưu ý khi thiết kế mạch cho digital IO: - Khi cấp nguồn, vi điều khiển sẽ cần một khoảng thời gian (tuy rất ngắn) để khởi động. Khi đó các chân IO sẽ ở trạng thái điện áp không xác định. Hiện tượng này có thể xảy ra chẳng hạn khi vừa cấp nguồn vào vi điều khiển thì bóng đèn chớp 1 cái. Để giải quyết v

STM32F103C8T6, #1 UART

UART là viết tắt của Universal Asynchronous Receiver – Transmitter, tạm dịch là truyền nhận bất đồng bộ. Trên máy tính thì chúng ta có thể hiểu nôm na là giao tiếp qua cổng COM. Các máy tính hiện nay nếu không có cổng COM thì chúng ta có thể sử dụng các thiết bị chuyển giao tiếp USB => COM. UART trên STM32F103C8T6 còn được gọi là TTL serial, giao thức này sử dụng mức tín hiệu giới hạn trong mức 0V - Vcc, nếu vi điều khiển 3.3V thì mức giới hạn là 0V-3.3V. Cổng COM trên máy tính có mức tín hiệu dao động -13V đến +13V. Cho nên bạn không thể nối trực tiếp từ vi điều khiển đến cổng COM máy tính nhé. Thay vào đó có thể sử dụng chip chuyển mức tín hiệu như là MAX232 chẳng hạn (google với từ khóa RS232 to TTL). Hoặc bạn cũng có thể sử dụng một mạch chuyển đổi USB to TTL serial (FT232RL). Board mà chúng ta sử dụng trong bài viết này sẽ là kit ra chân của STM32F103C8T6 như hình dưới, board này còn có tên gọi là blue pill. Để nạp chương trình cho board này chúng ta cần có mạch