Với mong muốn làm rõ các kiến thức đã học và giới thiệu các ứng dụng cơ bản của hệ thống nhúng, nhóm chúng em đưa ra mô hình thiết kế 2 kênh ADC đọc giá trị của 2 cảm biến hoặc 2 biến tr
Trang 1KỸ THUẬT ĐIỆN – ĐIỆN TỬ 1
***
BÁO CÁO BÀI TẬP
HỆ THỐNG NHÚNG
Thực hiện ADC hiện thị lên led 7 thanh và
đọc giá trị các kênh
Giảng viên: TS Nguyễn Ngọc Minh
Sinh viên nhóm 01
Đặng Văn Hưng
Đỗ Xuân Lộc Nguyễn Hữu Hùng Phạm Văn Thưởng
- B18DCDT100
- B18DCDT139
- B18DCDT092
- B18DCDT251
Hà Nội, 2021
Trang 2Mục lục
LỜI NÓI ĐẦU 2
I Giới thiệu đề tài 3
II Sơ đồ nguyên lý 3
III Linh kiện sử dụng 4
1 STM32F103C8T6 4
2 Module led 7 thanh 4 số TM1637 6
3 Nút nhấn 7
4 Biến trở volume 8
IV Nguyên lý hoạt động 8
1 Hiển thị cho led 7 đoạn 9
2 Lập trình trong ADC trong STM32 11
a) Khởi tạo biến cấu hình cho ADC và GPIO 11
b) Cấp clock và cấu hình input ADC là PA4 PA5 12
c) Cấu hình cho DMA và đọc giá trị từ DMA 12
d) Button cấu hình theo sơ đồ sau 12
e) Kết quả 13
VI Tài liệu tham khảo 17
LỜI CẢM ƠN 18
Trang 3LỜI NÓI ĐẦU
Ngày nay, các hệ thống nhúng trở nên phổ biến và đóng vai trò quan trọng trong đời sống con người Ví dụ quanh ta có rất nhiều sản phẩm nhúng như lò vi sóng, nồi cơm điện, điều hòa, điện thoại di động, ô tô, máy bay, tàu thủy, các đầu đo, cơ cấu chấp hành thông minh, robot v.v ta có thể thấy hiện nay hệ thống nhúng có mặt ở mọi lúc mọi nơi trong cuộc sống của chúng ta
Qua môn học hệ thống nhúng, chúng em đã hiểu thêm về các hệ thống nhúng trong thực tế, về đặc điểm, tính ưu việt cũng như tính ứng dụng của chúng đối với con người Với mong muốn làm rõ các kiến thức đã học và giới thiệu các ứng dụng cơ bản của hệ thống nhúng, nhóm chúng em đưa ra mô hình thiết kế 2 kênh ADC đọc giá trị của 2 cảm biến hoặc 2 biến trở và hiển thị lên 4 con led 7 thanh và có nút nhấn chọn cảm biến hiển thị – một sản phẩm rất quen thuộc và cần thiết trong đời sống
Do thời gian thực hiện và kiến thức còn hạn chế nên còn nhiều sai sót
trong quá trình thực hiện đề tài, rất mong được sự bổ sung đóng góp của các
thầy cô và các bạn Chúng em xin chân thành cảm ơn các thầy cô trong khoa
điện tử, cảm ơn thầy Minh đã tận tình hướng dẫn và giúp đỡ chúng em thực
hoàn thành đề tài này
Trang 4I Giới thiệu đề tài
Hiểu rõ về cách hoạt động của ADC được ứng dụng rất nhiều như
đo nhiệt độ, đọc giá trị điện áp, cường độ dòng điện, đọc phím nhấn, đọc giá trị biến trở, bảo vệ động cơ…, ADC có số bit càng cao tức là độ phân giải của bộ ADC càng lớn
Sử dụng ADC của STM32F103R6 để đọc giá trị của biến trở sau đó hiển thị lên LED7thanh Thay đổi giá trị của ADC bằng cách thay đổi vị trí của con trỏ ở biến trở
Làm rõ về ADC trên STM32F103R6, lập trình giao tiếp với led 7 thanh
II Sơ đồ nguyên lý
Mạch nguyên lý mô phỏng bằng fritzing
H/a: Mạch nguyên lý mô phỏng bằng fritzing
III Linh kiện sử dụng
Trang 51 STM32F103C8T6
STM32 là một trong những dòng chip phổ biến của ST với nhiều họ thông dụng như F0,F1,F2,F3,F4… Stm32f103 thuộc họ F1 với lõi là ARM
COTEX M3 STM32F103 là vi điều khiển 32 bit, tốc độ tối đa là 72Mhz Giá thành cũng khá rẻ so với các loại vi điều khiển có chức năng tương tự Mạch nạp cũng như công cụ lập trình khá đa dạng và dễ sử dụng
Cấu hình chi tiết :
ARM 32-bit Cortex M3 với clock max là 72Mhz
Bộ nhớ:
o 64 kbytes bộ nhớ Flash(bộ nhớ lập trình)
o 20kbytes SRAM
Clock, reset và quản lý nguồn
o Điện áp hoạt động 2.0V -> 3.6V
o Power on reset(POR), Power down reset(PDR) và programmable voltage detector (PVD)
o Sử dụng thạch anh ngoài từ 4Mhz -> 20Mhz
o Thạch anh nội dùng dao động RC ở mode 8Mhz hoặc 40khz
o Sử dụng thạch anh ngoài 32.768khz được sử dụng cho RTC
Trang 6 Trong trường hợp điện áp thấp:
o Có các mode :ngủ, ngừng hoạt động hoặc hoạt động ở chế độ chờ
o Cấp nguồn ở chân Vbat bằng pin để hoạt động bộ RTC và sử dụng lưu trữ data khi mất nguồn cấp chính
2 bộ ADC 12 bit với 9 kênh cho mỗi bộ
o Khoảng giá trị chuyển đổi từ 0 – 3.6V
o Lấy mẫu nhiều kênh hoặc 1 kênh
o Có cảm biến nhiệt độ nội
DMA: bộ chuyển đổi này giúp tăng tốc độ xử lý do không có sự can thiệp quá sâu của CPU
o 7 kênh DMA
o Hỗ trợ DMA cho ADC, I2C, SPI, UART
7 timer
o 3 timer 16 bit hỗ trợ các mode IC/OC/PWM
o 1 timer 16 bit hỗ trợ để điều khiển động cơ với các mode bảo vệ như ngắt input, dead-time
o 2 watdog timer dùng để bảo vệ và kiểm tra lỗi
o 1 sysTick timer 24 bit đếm xuống dùng cho các ứng dụng như hàm Delay…
Hỗ trợ 9 kênh giao tiếp bao gồm:
o 2 bộ I2C(SMBus/PMBus)
o 3 bộ USART(ISO 7816 interface, LIN, IrDA capability, modem control)
o 2 SPIs (18 Mbit/s)
o 1 bộ CAN interface (2.0B Active)
o USB 2.0 full-speed interface
Kiểm tra lỗi CRC và 96-bit ID
Trang 72 Module led 7 thanh 4 số TM1637
Led 7 thanh 4 số là một trong những led 7 thanh được dùng nhiều trong các mô hình điện tử, các thiết bị cần hiển thị thông số: điện áp vào, điện áp ra
Led 7 đoạn 4 số có 4 chân với kích thước nhỏ gọn, màu hiển thị dễ dàng cho việc lắp đặt trên các mạch điện tử
Thông số kỹ thuật
- 4 số
- Số chân: 4 chân
Thứ tự chân và cách kết nối với Arduino:
- VCC : nối với chân 5V
- GND : nối với chân GND
- CLK và DIO gắn vào chân digital
Trang 83 Nút nhấn
Nút ấn là một loại công tắc đơn giản điều khiển hoạt động của máy hoặc một số loại quá trình Hầu hết, các nút nhấn là nhựa hoặc kim loại Hình dạng của nút ấn có thể phù hợp với ngón tay hoặc bàn tay để sử dụng dễ dàng Tất cả phụ thuộc vào thiết kế cá nhân Nút ấn có 2 loại chính là nút nhấn thường mở hoặc nút nhấn thường đóng
Trang 94 Biến trở volume
Biến trở là các thiết bị có điện trở thuần có thể biến đổi được theo ý
muốn Chúng có thể được sử dụng trong các mạch điện để điều chỉnh hoạt động của mạch điện
Điện trở của thiết bị có thể được thay đổi bằng cách thay đổi chiều dài của dây dẫn điện trong thiết bị, hoặc bằng các tác động khác như nhiệt độ thay đổi, ánh sáng hoặc bức xạ điện từ,
Nguyên lý hoạt động chủ yếu của biến trở là các dây dẫn được tách rời dài ngắn khác nhau Trên các thiết bị sẽ có vi mạch điều khiển hay các núm vặn Khi thực hiện điều khiển các núm vặn các mạch kín sẽ thay đổi chiều dài dây dẫn khiến điện trở trong mạch thay đổi
Thực tế việc thiết kế mạch điện tử luôn có một khoảng sai số, nên khi
thực hiện điều chỉnh mạch điện người ta phải dùng biến trở, lúc này biến trở
có vai trò phân áp, phân dòng trong mạch
IV Nguyên lý hoạt động
Để hiểu được nguyên lý hoạt động của mạch, trước tiên phải hiểu rõ ADC
là gì, lập trình ADC trong STM32F103F6
ADC là Analog to Digital Converter là bộ chuyển đổi tín hiệu tương tự sang tín hiệu số Được ứng dụng rất nhiều như đo nhiệt độ, đọc giá trị điện
Trang 10áp, cường độ dòng điện, đọc phím nhấn, đọc giá trị biến trở, bảo vệ động
cơ…, ADC có số bit càng cao tức là độ phân giải của bộ ADC càng lớn
ADC trong STM32F103R6 là bộ ADC có 12 bit, tức giá trị đọc về trong khoảng 0 đến 2^12 = 4096
1 Hiển thị cho led 7 đoạn.
Để có thể hiển thị thì phải xây dựng thư viện riêng, ta cần xây dựng các giao thức cần thiết
Các giao tiếp ta cần giao diện nối tiếp 2 dây CLK, DIO
Dữ liệu của bộ vi xử lý nhận ra giao tiếp với TM1637 bằng giao diện bus hai dây (Lưu ý: Phương thức giao tiếp hoàn toàn không bằng với giao thức bus 12C vì không có địa chỉ phụ) Khi dữ liệu được đưa vào, tín hiệu DIO không được thay đổi đối với CLK mức cao và tín hiệu DIO sẽ thay đổi đối với tín hiệu CLK mức thấp Khi CLK là mức cao và DIO thay đổi từ mức cao xuống mức thấp, đầu vào dữ liệu sẽ bắt đầu Khi CLK là mức cao và
DIO thay đổi từ mức thấp lên mức cao, đầu vào dữ liệu kết thúc Truyền dữ liệu TM1637 mang tín hiệu trả lời ACK
Trang 11Điều kiện bắt đầu đạt được bằng cách hạ thấp dòng DIO trong khi dòng đồng hồ ở trạng thái cao, sau đó điều kiện dừng được hạ xuống
Để truyền dữ liệu đúng, một tín hiệu trả lời ACK được tạo bên trong chip
để hạ chân DIO ở mức không đạt của xung nhịp thứ 8 Dây giao diện DIO được phát hành vào cuối của xung clock thứ 9
Có 4 loại gói
Về hiển thị lên led ta nói đến gói Control display là lệnh điều khiển hiển thị chốt dữ liệu được lưu trữ trong các thanh ghi bên trong bằng cách thiết lập B3 B0 B1, và B2 được sử dụng để hiển thị độ sáng màn hình Màn hình có thể được tắt bằng cách đặt lại B3
Khi lệnh điều khiển màn hình được thực thi, dữ liệu được lưu trữ trong thanh ghi bên trong sẽ được chốt và xuất hiện ở các chân phân đoạn
Trang 12Ví dụ thanh ghi có giá trị 0x06 (00000110), khi gói hiển thị điều khiển được nhận và B3 được kích hoạt các chân phân đoạn sẽ có mức logic sau, và theo sơ đồ mạch số 1 sẽ hiển thị ở chữ số đầu tiên
2 Lập trình trong ADC trong STM32
a) Khởi tạo biến cấu hình cho ADC và GPIO
b) Cấp clock và cấu hình input ADC là PA4 PA5
Trang 13c) Cấu hình cho DMA và đọc giá trị từ DMA
d) Button cấu hình theo sơ đồ sau
Trang 14e) Kết quả
// Includes -*/
#include "stm32f10x.h"
#include <stdio.h>
#define ARRAYSIZE 8*4
#define ADC1_DR ((uint32_t)0x4001244C)
volatile uint16_t ADC_values[ARRAYSIZE];
volatile uint32_t status = 0;
void ADCInit(void);
void DMAInit(void);
int main(void){
uint8_t index;
ADCInit();
DMAInit();
//Enable DMA1 Channel transfer
Trang 15DMA_Cmd(DMA1_Channel1, ENABLE);
//Start ADC1 Software Conversion
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
//wait for DMA complete
while (!status){};
ADC_SoftwareStartConvCmd(ADC1, DISABLE);
//print averages
/*for(index = 0; index<8; index++)
{ printf("ch%d = %d ",index, ADC_values[index]);
}*/
for(index = 0; index<8; index++){
printf("\r\n ADC value on ch%d = %d\r\n",
index, (uint16_t)((ADC_values[index]+ADC_values[index+8]
+ADC_values[index+16]+ADC_values[index+24])/4));
}
while (1)
{
//interrupts does the job
}
}
void ADCInit(void){
// Enable ADC1 and
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 |
RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure; //Variable used to setup the
GPIO pins
//==Configure ADC pins (PA0 -> Channel 0 to PA7 -> Channel 7) as
analog inputs==
GPIO_StructInit(&GPIO_InitStructure); // Reset init structure, if not it can cause issues
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1|
GPIO_Pin_2| GPIO_Pin_3| GPIO_Pin_4| GPIO_Pin_5| GPIO_Pin_6|
GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_InitTypeDef ADC_InitStructure;
//ADC1 configuration
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
//We will convert multiple channels
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
Trang 16//select continuous conversion mode
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//!
//select no external triggering
ADC_InitStructure.ADC_ExternalTrigConv =
ADC_ExternalTrigConv_None;
//right 12-bit data alignment in ADC data register
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
//8 channels conversion
ADC_InitStructure.ADC_NbrOfChannel = 8;
//load structure values to control and status registers
ADC_Init(ADC1, &ADC_InitStructure);
//wake up temperature sensor
//ADC_TempSensorVrefintCmd(ENABLE);
//configure each channel
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1,
ADC_SampleTime_41Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2,
ADC_SampleTime_41Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3,
ADC_SampleTime_41Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4,
ADC_SampleTime_41Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 5,
ADC_SampleTime_41Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 6,
ADC_SampleTime_41Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 7,
ADC_SampleTime_41Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 8,
ADC_SampleTime_41Cycles5);
//Enable ADC1
ADC_Cmd(ADC1, ENABLE);
//enable DMA for ADC
ADC_DMACmd(ADC1, ENABLE);
//Enable ADC1 reset calibration register
ADC_ResetCalibration(ADC1);
//Check the end of ADC1 reset calibration register
while(ADC_GetResetCalibrationStatus(ADC1));
//Start ADC1 calibration
ADC_StartCalibration(ADC1);
//Check the end of ADC1 calibration
while(ADC_GetCalibrationStatus(ADC1));
}
void DMAInit(void){
Trang 17//enable DMA1 clock
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
//create DMA structure
DMA_InitTypeDef DMA_InitStructure;
//reset DMA1 channe1 to default values;
DMA_DeInit(DMA1_Channel1);
//channel will be used for memory to memory transfer
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
//setting normal mode (non circular)
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
//medium priority
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
//source and destination data size word=32bit
DMA_InitStructure.DMA_PeripheralDataSize =
DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize =
DMA_MemoryDataSize_HalfWord;
//automatic memory destination increment enable
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
//source address increment disable
DMA_InitStructure.DMA_PeripheralInc =
DMA_PeripheralInc_Disable;
//Location assigned to peripheral register will be source
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
//chunk of data to be transfered
DMA_InitStructure.DMA_BufferSize = ARRAYSIZE;
//source and destination start addresses
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_values; //send values to DMA registers
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
// Enable DMA1 Channel Transfer Complete interrupt
DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);
DMA_Cmd(DMA1_Channel1, ENABLE); //Enable the DMA1 -
Channel1
NVIC_InitTypeDef NVIC_InitStructure;
//Enable DMA1 channel IRQ Channel */
NVIC_EnableIRQ(DMA1_Channel1_IRQn);
}
V Ứng dụng và hướng phát triển
Mạch chuyển đổi tương tự ra số hay ADC (viết tắt tiếng Anh: Analog-to-Digital Converter) là hệ thống mạch thực hiện chuyển đổi một tín hiệu
Trang 18analog (tín hiệu tương tự) liên tục, ví dụ như tín hiệu âm thanh thanh
micro, hay tín hiệu ánh sáng trong máy ảnh kỹ thuật số, thành tín hiệu
số.Một hệ thống ADC có thể bao gồm một bộ phận phần cứng (như một
bộ tính toán độc lập) làm nhiệm vụ chuyển đổi tín hiệu analog (dưới dạng điện áp hay dòng điện) thành các giá trị số (digital) đại diện cho cường độ điện áp hay tín hiệu đó Thông thường, tín hiệu số ngõ ra (digital output) mang dạng nhị phân bù 2 tỉ lệ với giá trị ngõ vào, nhưng cũng có một số khả năng khác
Có một số kiến trúc ADC đang được sử dụng Do sự phức tạp của kiến trúc và yêu cầu về độ chính xác, phần lớn các hệ thống ADC đều được sản xuất bên trong mạch tích hợp (IC) Tại ngõ vào chính của ADC trong chip có thể có phần tử Multiplexer, cho ra ADC đa ngõ vào hay ADC đa kênh Trước đây giá thành ADC cao, nên đã bố trí 8 đến 64 ngõ vào Hiện nay xuất hiện các chip chỉ bố trí 1, 2 hoặc 4 ngõ vào
Ngoài ra lập trình ADC còn có thể ứng dụng thực tế cho một số lĩnh vực như:
- Đo đạc trong vật lý, hóa học, sinh học, y học, đo lường điện,
- Âm nhạc, hình ảnh, truyền hình truyền thông,
- Thông tin liên lạc, thiết bị dân sinh, chip chỉ bố trí 1, 2 hoặc 4 ngõ vào
VI Tài liệu tham khảo
- Bài tập được tham khảo từ nhiều nguồn khác nhau:
https://deviot.vn/tutorials/stm32f1.23165131/adc-voi-stm32.73721443
https://khuenguyencreator.com/lap-trinh-stm32-doc-adc-mot-kenh/
https://tapit.vn/chuc-nang-adc-su-dung-vi-dieu-khien-stm32f103c8t6/
https://sinhviendien.com/2021/07/03/bai-08-lap-trinh-adc-smt32/
https://vi.wikipedia.org/wiki/ADC#C%C3%A1c_nh%C3%B3m