基于STM32標準庫智能風扇設計

目錄

一,前言

二,系統方案選擇

三,實體展示

工程分類

?四,相關代碼

PWM.c

PWM.h

AD.c

AD.h

電機驅動程序

舵機驅動


一,前言

? 當今生活中,風扇已成為人們解暑的重要工具,然而使用風扇緩解夏日酷熱的同時也存在著一些問題,傳統風扇只能根據選擇的檔位來設置轉速,而不能根據周圍環境溫度的變化而自動調節轉速。基于以上設計了自動調速風扇系統。

二,系統方案選擇

本系統由按鍵控制和液晶顯示兩部分組成。工作區內由單片機stm32F103C8熱敏電阻傳感器,當溫度達到設定閾值時,從而通過PWM控制電機做相應動作。

環境溫度采集模塊:采用熱敏電阻,可滿足 40 攝氏度至 90 攝氏度測量范圍

電機模塊:采用舵機同直流電機搭配,舵機具有扭力大容易控制。小型直流減速電機,減速電機控制精度低,且速度均勻性好,控制簡單,電源要求低,易于實現。

T86612FNG電機驅動? ?,直流電機130

顯示模塊:OLED顯示屏,快速插接小巧設計,是內容顯示和程序調試的利器,從此程序清晰可見。

舵機:SG90

?如圖2為STM32F103單片機最小系統電路原理圖。該最小系統電路主要包括時鐘、按鍵復位和供電電路三部分。

三,實體展示

工程分類

?

?

?

?四,相關代碼

PWM.c

#include "stm32f10x.h"                  // Device headervoid PWM_Init1(void)
{GPIO_InitTypeDef GPIO_InitStructure; 			//定義GPIO初始化結構體變量TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_OCInitTypeDef TIM_OCInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);  //開啟定時器2RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//通道2時鐘使能函數GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//設置GPIO為推挽輸出模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //PA1 PA2			GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	//速度設置為 50MHzGPIO_Init(GPIOA, &GPIO_InitStructure);	//按照以上參數進行 GPIO的初始化TIM_InternalClockConfig(TIM2);//TIM的時基單元由內部時鐘控制TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_Period = 20000 - 1; //ARR 自動重裝器的值TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1; //PSC 預分頻器的值 對72M(720000000)進行 7200分頻 即10K的頻率下 計10000個數 1s的時間TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//重復計數器的值 CCRTIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure); TIM_OCStructInit(&TIM_OCInitStructure);TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//輸出極性選擇TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//輸出狀態使能TIM_OCInitStructure.TIM_Pulse = 20;//CCR,即占空比為 10%TIM_OC2Init(TIM2,&TIM_OCInitStructure);//OC編號要與通道編號對應TIM_Cmd(TIM2,ENABLE);
}void PWM_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure; 			//定義GPIO初始化結構體變量TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_OCInitTypeDef TIM_OCInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);  //開啟定時器3RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//通道2時鐘使能函數GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//設置GPIO為推挽輸出模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	//速度設置為 50MHzGPIO_Init(GPIOB, &GPIO_InitStructure);	//按照以上參數進行 GPIO的初始化TIM_InternalClockConfig(TIM3); //內部時鐘配置TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_Period = 100 - 1; //ARR 自動重裝器的值TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1; //PSC 預分頻器的值 TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//重復計數器的值 CCRTIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure); TIM_OCStructInit(&TIM_OCInitStructure);TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//輸出極性選擇TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//輸出狀態使能TIM_OCInitStructure.TIM_Pulse = 50;//CCR,即占空比為 10%TIM_OC3Init(TIM3,&TIM_OCInitStructure);//OC編號要與通道編號對應//TIM_OC2Init(TIM3,&TIM_OCInitStructure);//OC編號要與通道編號對應TIM_Cmd(TIM3,ENABLE);
}void PWM_SetCompare_Servo(uint16_t Compare) //舵機
{TIM_SetCompare2(TIM2, Compare);
}void PWM_SetCompare_Motor(uint16_t Compare) //風扇
{TIM_SetCompare3(TIM3, Compare);}

PWM.h

#ifndef __PWM_H
#define __PWM_Hvoid PWM_Init(void);
void PWM_Init1(void);void PWM_SetCompare_Motor(uint16_t Compare);
void PWM_SetCompare_Servo(uint16_t Compare);#endif

AD.c

#include "stm32f10x.h"                  // Device headervoid AD_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_ADCCLKConfig(RCC_PCLK2_Div6);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);ADC_InitTypeDef ADC_InitStructure;ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;ADC_InitStructure.ADC_ScanConvMode = DISABLE;ADC_InitStructure.ADC_NbrOfChannel = 1;ADC_Init(ADC1, &ADC_InitStructure);ADC_Cmd(ADC1, ENABLE);ADC_ResetCalibration(ADC1);while (ADC_GetResetCalibrationStatus(ADC1) == SET);ADC_StartCalibration(ADC1);while (ADC_GetCalibrationStatus(ADC1) == SET);
}uint16_t AD_GetValue(void)
{ADC_SoftwareStartConvCmd(ADC1, ENABLE);while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);return ADC_GetConversionValue(ADC1);
}

AD.h

#ifndef __AD_H
#define __AD_Hvoid AD_Init(void);
uint16_t AD_GetValue(void);#endif

電機驅動程序

#include "stm32f10x.h"                  // Device header
#include "PWM.h"
#include "Delay2.h"
#include "OLED.h"
#include "LED1.h"
#include "Key.h"float Speed=0;
void Motor_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);PWM_Init1();
}void Motor_SetSpeed(int8_t Speed)
{if (Speed >= 0){GPIO_ResetBits(GPIOA, GPIO_Pin_4);GPIO_SetBits(GPIOA, GPIO_Pin_5);PWM_SetCompare_Motor(Speed);}else{GPIO_SetBits(GPIOA, GPIO_Pin_4);GPIO_ResetBits(GPIOA, GPIO_Pin_5);PWM_SetCompare_Motor(-Speed);}
}
void Motor_Speed_Set(uint8_t KeyNum)
{//Key_Init1();//Key_Init();//KeyNum = Key_GetNum();if(KeyNum == 1){Speed += 20;if(Speed > 80){Speed =0;}}void LED11_OFF(void);void LED22_ON(void);OLED_ShowNum(3,7,Speed,3);OLED_ShowNum(2,8,KeyNum,1);Motor_SetSpeed(Speed);}

舵機驅動

#include "stm32f10x.h"                  // Device header
#include "PWM.h"#include "OLED.h"#include "Key.h"
#include "LED1.h"float Angle;void Servo_Init(void)
{PWM_Init();
}void Servo_SetAngle(float Angle)
{PWM_SetCompare_Servo(Angle / 180 * 2000 + 500);
}
void Servo_Turn(uint8_t KeyNum)
{	KeyNum = Key_GetNum();if (KeyNum == 2){Angle += 30;if (Angle > 180){Angle = 0;}}Servo_SetAngle(Angle);OLED_ShowNum(2,8,KeyNum,1);OLED_ShowNum(1, 7, Angle, 3);}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/43490.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/43490.shtml
英文地址,請注明出處:http://en.pswp.cn/news/43490.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CentOS系統環境搭建(九)——centos系統下使用docker部署項目

centos系統環境搭建專欄🔗點擊跳轉 關于Docker-compose安裝請看CentOS系統環境搭建(三)——Centos7安裝Docker&Docker Compose,該文章同樣收錄于centos系統環境搭建專欄。 Centos7部署項目 采用前后端分離的形式部署。使用Do…

【Sklearn】基于隨機梯度下降算法的數據分類預測(Excel可直接替換數據)

【Sklearn】基于隨機梯度下降算法的數據分類預測(Excel可直接替換數據) 1.模型原理2.模型參數3.文件結構4.Excel數據5.下載地址6.完整代碼7.運行結果1.模型原理 隨機梯度下降(Stochastic Gradient Descent,SGD)是一種優化算法,用于訓練模型的參數以最小化損失函數。在分…

QT學習筆記-QT5.15編譯及安裝谷歌拼音輸入法(QtInputMethod_GooglePinyin)

QT學習筆記-QT5.15編譯及安裝谷歌拼音輸入法(QtInputMethod_GooglePinyin) 0、背景1、環境2、下載QtInputMethod_GooglePinyin源碼3、使用MinGW64構建套件編譯3.1 編譯QtInputMethod_GooglePinyin源碼3.2、部署tgtsmlInputContextPlugin輸入法插件3.3、運…

Lombok注解在JSON化中,JSON生成額外生成字段問題

問題描述: 定義如下對象 Dataclass A{private String A;public String getC() {return "abab";}} 執行如下邏輯 Autowiredprivate ObjectMapper objectMapper;Testpublic void test4() throws Exception {A a new A();a.setA("a");System.ou…

分布式 - 服務器Nginx:一小時入門系列之負載均衡

文章目錄 1. 負載均衡2. 負載均衡策略1. 輪詢策略2. 最小連接策略3. IP 哈希策略4. 哈希策略5. 加權輪詢策略 1. 負載均衡 跨多個應用程序實例的負載平衡是一種常用技術,用于優化資源利用率、最大化吞吐量、減少延遲和確保容錯配置。?使用 nginx 作為非常有效的HT…

【MySQL】如何使用Shared-memory協議(Windows)連接MySQL數據庫

文章目錄 【MySQL】如何使用Shared-memory協議(Windows)連接MySQL數據庫連接MySQL的協議使用Shared-memory協議(Windows)連接MySQL步驟1:確認MySQL服務器已啟用Shared-memory連接啟動Shared-memory連接方法 步驟2:客戶端使用shared-memory連接MySQL服務器…

神經網絡基礎-神經網絡補充概念-55-為什么是ML策略

“ML策略”(Machine Learning Strategies)是指在解決機器學習問題時,采取的一系列方法、技巧和策略。選擇適當的ML策略對于獲得高質量的模型和結果非常重要。以下是為什么要考慮ML策略的一些原因: 問題適應性:不同的機…

2023 最新版網絡安全保姆級指南,從 0 基礎進階網絡攻防工程師

一、網絡安全學習的誤區 1.不要試圖以編程為基礎去學習網絡安全 不要以編程為基礎再開始學習網絡安全,一般來說,學習編程不但學習周期長,且過渡到網絡安全用到編程的用到的編程的關鍵點不多。一般人如果想要把編程學好再開始學習網絡安全往…

Vue實例生命周期中的所有鉤子函數

在 Vue 3 中,實例生命周期的鉤子函數被整合為了兩個主要的階段:Composition API 階段和 Options API 階段。下面是 Vue 3 中的所有生命周期鉤子函數: Composition API 階段: setup //在組件實例創建之前執行,用于設…

centos 之安裝 openssl 1.1.1報錯

源碼make時報錯,可能是系統的perl的版本太低問題。 [rootlocalhost ~]# cpan -a | grep Test::More Test::More 0.92 1.302171 EXODIST/Test-Simple-1.302171.tar.gz [rootlocalhost ~]# cpan -a | grep Text::Template [rootlocalhost ~]# …

Dockerfile小記(持續)

文章目錄 信息新建用戶服務重啟數據庫相關SSH無交互安裝auth.logssh開機自啟 Apache服務配置 信息 Alpine系統 新建用戶 useradd命令參考 RUN apk update \ && apk add shadow \&& useradd -m togie \&& echo togie:12345 | chpasswd \&& &…

nginx負載均衡配置案例

一、nginx代理配置 ## 定義一個集群,名稱叫做load_balancer_testupstream load_balancer_test {#ip_hash是負載均衡策略#ip_hash;#集群下有兩個服務server 192.168.1.233:8087;server 192.168.1.243:8087;}server {#監聽8600端口listen 8600;server_name loc…

Lnton羚通關于PyTorch的保存和加載模型基礎知識

SAVE AND LOAD THE MODEL (保存和加載模型) PyTorch 模型存儲學習到的參數在內部狀態字典中,稱為 state_dict, 他們的持久化通過 torch.save 方法。 model models.shufflenet_v2_x0_5(pretrainedTrue) torch.save(model, "../../data/ShuffleNetV2_X0.5.pth…

vue2.6升級vue2.7(panjiachen升級指南)vue-cli5多頁面應用升級的坑

vue2.7升級指南 vue2.7升級指南 之前的架子使用的是 panjiachen,使用的是 vue2.6.14,現在升級為 vue2.7.x 升級vue/cli vue upgrade 這里推薦使用 vue upgrade 命令自動升級 # 確保安裝全局 vue/cli $ npm install -g vue/cli $ vue upgradeWARN Th…

水庫大壩安全監測MCU,提升大壩管理效率的利器!

水庫大壩作為防洪度汛的重要設施,承擔著防洪抗旱,節流發電的重要作用。大壩的安全直接關系到水庫的安全和人民群眾的生命財產安全。但因為水庫大壩的隱患不易被察覺,發現時往往為時已晚。因此,必須加強對大壩的安全管理。其安全監…

RFID技術助力汽車零配件裝配產線,提升效率與準確性

隨著科技的不斷發展,越來越多的自動化設備被應用到汽車零配件裝配產線中。其中,射頻識別(Radio Frequency Identification,簡稱RFID)技術憑借其獨特的優勢,已經成為了這一領域的重要技術之一。本文將介紹RF…

【SLAM】ORBSLAM34macOS: ORBSLAM3 Project 4(for) macOS Platform

文章目錄 配置ORBSLAM34macOS 版本運行步驟:版本修復問題記錄:編譯 fix運行 fix 配置 硬件:MacBook Pro Intel CPU 系統:macOS Ventura 13.4.1 ORBSLAM34macOS 版本 https://github.com/phdsky/ORB_SLAM3/tree/macOS 運行步驟&…

初識結構體

文章目錄 目錄1. 結構體類型的聲明1.1 結構的基礎知識1.2 結構的聲明1.3 結構成員的類型1.4 結構體變量的定義和初始化 2. 結構體成員的訪問3. 結構體傳參 目錄 結構體類型的聲明結構體初始化結構體成員訪問結構體傳參 1. 結構體類型的聲明 1.1 結構的基礎知識 結構是一些值的…

三維可視化平臺有哪些?Sovit3D可視化平臺怎么樣?

隨著社會經濟的發展和數字技術的進步,互聯網行業發展迅速。為了適應新時代社會發展的需要,大數據在這個社會經濟發展過程中隨著技術的進步而顯得尤為重要。同時,大數據技術的快速發展進程也推動了可視化技術的飛速發展,國內外各類…

四層和七層負載均衡的區別

一、四層負載均衡 四層就是ISO參考模型中的第四層。四層負載均衡器也稱為四層交換機,它主要時通過分析IP層和TCP/UDP層的流量實現的基于“IP端口”的負載均衡。常見的基于四層的負載均衡器有LVS、F5等。 以常見的TCP應用為例,負載均衡器在接收到第一個來…