So sánh giữa Cảm biến nhiệt độ PT100 thăm dò và Mô -đun DS18B20
1) Nguyên tắc cơ bản của thu nhận tín hiệu
Điện trở của PT100 thay đổi theo tỷ lệ theo nhiệt độ (nhiệt độ càng cao, điện trở càng lớn), Nhưng sự thay đổi kháng cự là rất nhỏ, Về 0.385 Ồ / bằng cấp;
Phạm vi đo nhiệt độ của PT100 là -200 ℃ -200 ℃, và tại 0, Điện trở chính xác bằng 100 Ồ;
③ Dòng điện làm việc của PT100 nên nhỏ hơn 5 ma;
④ Mặc dù điện trở của PT100 thay đổi theo tỷ lệ theo nhiệt độ, Tỷ lệ thay đổi của nó (đó là, Giá trị k giá trị k giá trị) khác nhau trong các phạm vi nhiệt độ khác nhau.
2) Bảng thay đổi điện trở nhiệt độ PT100
3. Mạch ổ đĩa PT100
1) Thông qua phương pháp phân chia điện áp, AD thu thập điện áp PT100 để thu được giá trị điện trở để tính nhiệt độ
Giá trị điện trở của PT100 trong nước ở nhiệt độ phòng (2525 ℃ 25) là về 109.89 Ồ.
Bộ vi điều khiển đầu ra điện áp 3,3V, và điện áp chia cho PT100 xấp xỉ:
109.89 ∗ 0.005 = 0.54945 V.
Giá trị quảng cáo được chuyển đổi theo công thức chuyển đổi quảng cáo xấp xỉ:
0.54945 / 3.3 ∗ 4096 = 681.98 ≈ 682
Khi nhiệt độ tăng một độ, Giả sử rằng điện trở của PT100 chỉ tăng lên 0.385 Ồ, Giá trị thay đổi của điện áp chia xấp xỉ bằng:
0.385 ∗ 0.005 = 0.001925 V.
Giá trị quảng cáo được chuyển đổi theo công thức chuyển đổi quảng cáo xấp xỉ:
0.001925 / 3.3 ∗ 4096 = 2.39 ≈ 2
Trong thí nghiệm, Nó đã được tìm thấy rằng do điện áp 3,3V không ổn định của nguồn điện STM32, ADC đã thu thập các dao động điện áp PT100 và lỗi phân chia điện áp lớn. Giải pháp tối ưu hóa là thiết kế mạch nguồn hiện tại không đổi. Bằng cách thu thập điện áp của PT100 và dòng điện của dòng điện không đổi, Có thể thu được điện trở của PT100, và sau đó giá trị nhiệt độ có thể thu được.
2) Mạch nguồn hiện tại không đổi dựa trên bộ điều chỉnh LDO (MD5333)
Có nhiều mạch lái xe để kiểm tra PT100 trên Internet, chẳng hạn như mạch cầu DC, Mạch nguồn hiện tại không đổi dựa trên bộ khuếch đại hoạt động, vân vân. Tác giả cũng đã dành rất nhiều thời gian trong việc chọn mạch lái xe, xem xét sự khó khăn của việc làm bảng và số lượng thành phần, và cuối cùng đã chọn mạch nguồn hiện tại không đổi dựa trên bộ điều chỉnh LDO (MD5333). Sơ đồ mạch như sau:
Tại thời điểm này, Lựa chọn phần cứng về cơ bản đã được hoàn thành. Hội đồng phát triển được sử dụng là bảng Elite Atom F10Zet6 của Zhengdian
Mô -đun DS18B20
Để kiểm tra nhiệt độ thời gian thực và so sánh nhiệt độ PT100, Mô -đun DS18B20 được thêm vào để kiểm tra so sánh hiệu chuẩn
1) Giới thiệu về DS18B20
DS18B20 là một cảm biến nhiệt độ một bus với phạm vi nhiệt độ kiểm tra là -55 ~+125 và độ chính xác là ± 0,5 ℃. Nhiệt độ trường được truyền trực tiếp theo cách kỹ thuật số một chiếc xe đạp, trong đó cải thiện đáng kể khả năng chống can thiệp của hệ thống. Nó có thể đọc trực tiếp nhiệt độ đo được, và có thể nhận ra phương pháp đọc giá trị kỹ thuật số 9 ~ 12 bit thông qua lập trình đơn giản theo yêu cầu thực tế. Phạm vi điện áp hoạt động của nó là 3 ~ 5,5V, Và nó sử dụng nhiều hình thức bao bì, Làm cho cài đặt hệ thống linh hoạt và thuận tiện. Độ phân giải đã đặt và nhiệt độ báo động được đặt bởi người dùng được lưu trữ trong EEPROM và vẫn được lưu sau khi mất điện.
2) Giới thiệu về thời gian làm việc của DS18B20
Tất cả các thiết bị xe buýt đơn yêu cầu thời gian tín hiệu nghiêm ngặt để đảm bảo tính toàn vẹn của dữ liệu. DS18B20 có 6 Các loại tín hiệu: Đặt lại xung, xung phản ứng, viết 0, viết 1, đọc 0 và đọc 1. Tất cả những tín hiệu này, Ngoại trừ xung phản hồi, các tín hiệu đồng bộ được gửi bởi máy chủ. Và tất cả các lệnh và dữ liệu được gửi với bit thấp của byte trước tiên.
① Đặt lại xung và xung phản hồi
Tất cả các thông tin liên lạc trên xe buýt bắt đầu với một chuỗi khởi tạo. Máy chủ đưa ra mức thấp và giữ mức thấp trong ít nhất 480us để tạo xung lại xung. Sau đó, máy chủ lưu trữ xe buýt, và điện trở kéo 4,7k kéo xe buýt cao, với thời gian trễ là 15 ~ 60us, và nhập chế độ nhận (Rx). Sau đó, DS18B20 kéo xe buýt thấp trong 60 ~ 240us để tạo xung phản hồi ở mức thấp.
② Viết thời gian
Thời gian ghi bao gồm viết 0 thời gian và viết 1 thời gian. Tất cả thời gian viết đều yêu cầu ít nhất 60us, và ít nhất 1US thời gian phục hồi được yêu cầu giữa hai thời gian ghi độc lập. Cả hai thời gian viết bắt đầu với máy chủ kéo xuống xe buýt. Viết 1 thời gian: Máy chủ đưa ra mức thấp, Sự chậm trễ cho 2us, Và sau đó phát hành xe buýt, trì hoãn 60us. Viết 0 thời gian: Máy chủ đưa ra mức thấp, Sự chậm trễ cho 60us, Và sau đó phát hành xe buýt với độ trễ 2us.
③ Đọc thời gian
Các thiết bị xe buýt đơn chỉ truyền dữ liệu đến máy chủ khi máy chủ phát hành thời gian đọc. Vì thế, Sau khi máy chủ phát hành lệnh đọc dữ liệu, Thời gian đọc phải được tạo ngay lập tức để nô lệ có thể truyền dữ liệu. Tất cả thời gian đọc đều yêu cầu ít nhất 60us, và ít nhất 1US thời gian phục hồi được yêu cầu giữa hai thời gian đọc độc lập. Mỗi thời gian đọc được bắt đầu bởi máy chủ, mà kéo xe buýt xuống ít nhất 1us. Máy chủ phải giải phóng xe buýt trong thời gian đọc và lấy mẫu trạng thái xe buýt trong vòng 15us sau khi thời gian bắt đầu. Quy trình thời gian đọc điển hình là: Máy chủ đưa ra độ trễ cấp thấp là 2US, Sau đó, máy chủ chuyển sang độ trễ chế độ đầu vào là 12us, Sau đó đọc mức hiện tại của xe buýt đơn, Và sau đó trì hoãn 50us.
Sau khi hiểu thời gian xe buýt đơn lẻ, Hãy cùng xem quá trình đọc nhiệt độ điển hình của DS18B20. Quá trình đọc nhiệt độ điển hình của DS18B20 là: Đặt lại → Gửi Skiprom (0XCC) → Gửi lệnh chuyển đổi bắt đầu (0x44) → Độ trễ → Đặt lại → Gửi lệnh Skiprom (0XCC) → Gửi lệnh bộ nhớ (0Xbe) → Đọc hai byte dữ liệu (tức là. nhiệt độ) liên tục → kết thúc.
3) Sơ đồ và cấu hình cubemax
Từ sơ đồ, Có thể thấy rằng DS18B20 được bật bởi cổng PG11 để mở cổng nối tiếp để in thông tin nhiệt độ
4) Mã bộ phận
Phần mã cấy ghép thư viện DS18B20 của nguyên tử Zhengdian và thực hiện các sửa đổi nhỏ
#IFNDEF __DS18B20_H
#Xác định __DS18B20_H
#bao gồm “Tim.h”
/***********************************************************************************/
/* Định nghĩa pin DS18B20 */
#Xác định DS18B20_DQ_GPIO_PORT GPiog
#Xác định DS18B20_DQ_GPIO_PIN GPIO_PIN_11
#Xác định DS18B20_DQ_GPIO_CLK_ENABLE() LÀM{ __Hal_rcc_gpiog_clk_enable(); }trong khi(0) /* Bật đồng hồ cổng PG */
/**********************************************************************************************/
/* Chức năng hoạt động IO */
#Xác định DS18B20_DQ_OUT(x) LÀM{ x ? \
HAL_GPIO_WRITEPIN(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN, Gpio_pin_set) : \
HAL_GPIO_WRITEPIN(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN, Gpio_pin_reset); \
}trong khi(0) /* Đầu ra cổng dữ liệu */
#Xác định DS18B20_DQ_IN HAL_GPIO_READPIN(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN) /* Đầu vào cổng dữ liệu */
UINT8_T DS18B20_INIT(Vô hiệu); /* Khởi tạo DS18B20 */
UINT8_T DS18B20_CHECK(Vô hiệu); /* Kiểm tra xem DS18B20 có tồn tại không */
DS18B20_GET_TEMATITY ngắn(Vô hiệu);/* Nhận nhiệt độ */
#endif
5. Mô -đun điều khiển từ xa hồng ngoại
1) Giao thức mã hóa mô -đun không dây
Các phương thức mã hóa được sử dụng rộng rãi để điều khiển từ xa hồng ngoại là: Giao thức NEC của PWM (Điều chế độ rộng xung) và giao thức RC-5 của Philips PPM (Điều chế vị trí xung). Điều khiển từ xa đi kèm với bảng phát triển sử dụng giao thức NEC, có các tính năng sau:
1. 8-Địa chỉ bit và độ dài hướng dẫn 8 bit;
2. Địa chỉ và lệnh được truyền hai lần (để đảm bảo độ tin cậy);
3. Điều chế vị trí xung PWM, với chu kỳ nhiệm vụ của người vận chuyển hồng ngoại truyền qua “0” Và “1”;
4. Tần số sóng mang là 38kHz;
5. Thời gian bit là 1.125ms hoặc 2,25ms;
Trong giao thức NEC, cách đặt dữ liệu trong giao thức thành ‘0’ hoặc ‘1? Đây, Bộ thu hồng ngoại và máy phát hồng ngoại được tách ra.
Máy phát hồng ngoại: Gửi dữ liệu giao thức ‘0, = 560us của truyền tín hiệu sóng mang + 560Hoa Kỳ không truyền tín hiệu tàu sân bay
Gửi dữ liệu giao thức ‘1, = 560us của truyền tín hiệu sóng mang + 1680Hoa Kỳ không truyền tín hiệu tàu sân bay
Định nghĩa bit của máy phát hồng ngoại được hiển thị trong hình bên dưới
Máy thu hồng ngoại: Nhận dữ liệu giao thức ‘0, = 560us Cấp thấp + 560chúng tôi cấp cao
Nhận dữ liệu giao thức ‘1, = 560us cấp thấp + 1680chúng tôi cấp cao
Định dạng dữ liệu của lệnh điều khiển từ xa NEC là: Thiết bị đầu cuối đồng bộ hóa, Mã địa chỉ, địa chỉ mã nghịch đảo, Mã kiểm soát, Kiểm soát mã nghịch đảo. Mã đồng bộ hóa bao gồm mức thấp 9ms và mức cao 4,5ms. Mã địa chỉ, địa chỉ mã nghịch đảo, Mã kiểm soát, và kiểm soát mã nghịch đảo là tất cả các định dạng dữ liệu 8 bit. Chúng được gửi theo thứ tự bit thấp đầu tiên và bit cao cuối cùng. Mã nghịch đảo được sử dụng để tăng độ tin cậy của truyền.
Vì thế, Chụp đầu vào có thể được sử dụng để đo chiều rộng xung của mức cao để đạt được giải mã điều khiển từ xa.
2) Sơ đồ và cấu hình cubemax
Từ sơ đồ, Chúng ta có thể thấy rằng mô -đun không dây được bật thông qua mã PB9 và thu thập thông qua 4 Các kênh của Tim4:
Mã pin mặc định của Tim4_ch4 không phải là PB9, Vì vậy, nó cần được đặt thủ công, và cài đặt ngắt được bật cùng một lúc
3) Mã bộ phận
Nắm bắt cạnh tăng thông qua chức năng gọi lại Tim
Tại thời điểm này, tín hiệu được giải mã có thể thu được:
Tại thời điểm này, Dữ liệu phức tạp hơn và có thể được xử lý một chút:
Hiệu ứng như sau:
Hai chữ số cuối cùng là mã được giải mã và mã nghịch đảo của nó. Tại thời điểm này, Nó có thể được định nghĩa là một macro để điều chỉnh ngưỡng nhiệt độ:
Hiệu ứng như sau:
Mã bộ phận hồng ngoại:
/* Mã người dùng bắt đầu tiêu đề */
/**
******************************************************************************
* @tài liệu : Hand.C
* @ngắn gọn : Cơ thể chương trình chính
******************************************************************************
* @chú ý
*
* <H2><trung tâm>&sao chép; Bản quyền (c) 2024 Stmicroelectronics.
* Tất cả quyền được bảo lưu.</trung tâm></H2>
*
* Thành phần phần mềm này được cấp phép bởi ST theo giấy phép 3 mệnh đề BSD,
* cái “Giấy phép”; Bạn không được sử dụng tệp này ngoại trừ tuân thủ
* Giấy phép. Bạn có thể có được một bản sao giấy phép tại:
* openSource.org/licenses/bsd-3 la cả
*
******************************************************************************
*/
/* Tiêu đề kết thúc mã người dùng */
/* Bao gồm ——————————————————————*/
#bao gồm “chính.h”
#bao gồm “Tim.h”
#bao gồm “usart.h”
#bao gồm “GPIO.H”
/* Riêng tư bao gồm ———————————————————-*/
/* Mã người dùng bắt đầu bao gồm */
#bao gồm “stdio.h”
#bao gồm “Chuỗi.h”
#Xác định Maxup 157
#Xác định MaxDown 87
#Xác định minup 221
#Xác định Mindown 61
/* Kết thúc mã người dùng bao gồm */
/* Typedef riêng ———————————————————–*/
/* Mã người dùng bắt đầu PTD */
/* Mã người dùng kết thúc PTD */
/* Định nghĩa riêng tư ————————————————————*/
/* Mã người dùng bắt đầu PD */
/* Mã người dùng kết thúc PD */
/* Macro riêng ————————————————————-*/
/* Mã người dùng bắt đầu PM */
/* Mã người dùng kết thúc PM */
/* Biến riêng ———————————————————*/
/* Mã người dùng bắt đầu PV */
UINT32_T UPCOUNT = 0;
giá trị uint16_t = 0;
UINT16_T VALUEDOWN = 0;
UINT8_T ISUPCAPT = 1;
UINT16_T chiều rộng = 0;
Bộ đệm UINT16_T[128]={0};
Bộ đệm UINT16_T = 0;
uint8_t rcvfalg = 0;
/* Mã người dùng kết thúc PV */
/* Nguyên mẫu chức năng riêng ———————————————–*/
void SystemClock_config(Vô hiệu);
/* Mã người dùng bắt đầu PFP */
/* Mã người dùng kết thúc PFP */
/* Mã người dùng riêng tư ———————————————————*/
/* Mã người dùng bắt đầu 0 */
void hal_tim_periodelapsedcallback(Tim_HandletyPedef *Htim)
{
Upcount ++;
}
void hal_tim_ic_capturecallback(Tim_HandletyPedef *Htim)
{
nếu như(isupcapt)//Nếu nó đang tăng lợi nhuận cạnh
{
ValueUp = HAL_TIM_READCapturedValue(Htim htim,Tim_Channel_4);
isupCapt = 0;
__Hal_tim_set_capturepolarity(Htim htim,Tim_Channel_4, Tim_icpolarity_falling);
Upcount = 0;
}
khác{
Valuedown = hal_tim_readcapturedValue(Htim htim,Tim_Channel_4);
isupCapt = 1;
__Hal_tim_set_capturepolarity(Htim htim,Tim_Channel_4, Tim_icPolarity_Rising);
chiều rộng = giá trị+upCount*65536-valueup;
nếu như(chiều rộng>4400&&chiều rộng<4600)
{
bộ đệm = 0;
bộ đệm[bộ đệm ++]= chiều rộng;
}
khác nếu(bộ đệm>0)
{
bộ đệm[bộ đệm ++]= chiều rộng;
nếu như(bộ đệm>32)
{
rcvfalg = 1;
bộ đệm = 0;
}
}
}
}
void bitbuffer2num(char num[])
{
Num[0]= 0;
Num[1]= 0;
Num[2]= 0;
Num[3]= 0;
vì(int i = 0;Tôi<32;i ++)
{
nếu như(bộ đệm[i+1]<1000)
{
Num[i/8]= num[i/8]<<1;
}
khác
{
Num[i/8]= num[i/8]<<1;
Num[i/8]|= 0x01;
}
}
}
/* Mã người dùng kết thúc 0 */
/**
* @Brief điểm nhập ứng dụng.
* @retval int
*/
int chính(Vô hiệu)
{
/* Mã người dùng bắt đầu 1 */
char printbuff[128]={0};
char num[4]={0};
phím char = 0;
/* Mã người dùng kết thúc 1 */
/* Cấu hình MCU——————————————————–*/
/* Đặt lại tất cả các thiết bị ngoại vi, Khởi tạo giao diện flash và systick. */
Hal_init();
/* Mã người dùng bắt đầu init */
/* Mã kết thúc mã người dùng */
/* Định cấu hình đồng hồ hệ thống */
SystemClock_Config();
/* Mã người dùng bắt đầu sysinit */
/* Mã người dùng kết thúc sysinit */
/* Khởi tạo tất cả các thiết bị ngoại vi được cấu hình */
Mx_gpio_init();
Mx_tim4_init();
MX_USART1_UART_INIT();
/* Mã người dùng bắt đầu 2 */
/* Mã người dùng kết thúc 2 */
/* Vòng lặp vô hạn */
/* Mã người dùng bắt đầu trong khi */
HAL_GPIO_TOGGLEPIN(LED0_GPIO_PORT,LED0_PIN);
HAL_TIM_BASE_START_IT(&Htim4);//Cập nhật hẹn giờ tạo ra một ngắt
HAL_TIM_IC_START_IT(&Htim4, Tim_Channel_4);//
trong khi (1)
{
nếu như(RCVFALG)
{
vì(int i = 0;Tôi<4;i ++)
{
Bitbuffer2Num(Num);
Sprintf(printbuff,”0xx “,Num[Tôi]);
Hal_uart_transmit(&Huart1, printbuff,Strlen(printbuff),HAL_MAX_DELAY);
}
// Sprintf(printbuff,”%u “,bộ đệm[Tôi]);
// Hal_uart_transmit(&Huart1, printbuff,Strlen(printbuff),HAL_MAX_DELAY);
// }
Hal_uart_transmit(&Huart1,”\r n”,2,HAL_MAX_DELAY);
rcvfalg = 0;
}
printf(“%d r n”,Num[3]);
nếu như(Num[3]== 157)
{
printf(“111111\r n”);
}
Hal_delay(1000);
/* Mã người dùng kết thúc trong khi */
/* Mã người dùng bắt đầu 3 */
}
/* Mã người dùng kết thúc 3 */
}
/**
* @Brief Cấu hình đồng hồ hệ thống
* @retval không có
*/
void SystemClock_config(Vô hiệu)
{
RCC_OSCITTYPEDEF RCC_OSCINITSTRUST = {0};
RCC_CLKINITTYPEDEF RCC_CLKINITSTRUST = {0};