当前位置:   article > 正文

基于STM32标准库智能风扇设计_stm32智能风扇

stm32智能风扇

目录

一,前言

二,系统方案选择

三,实体展示

工程分类

 四,相关代码

PWM.c

PWM.h

AD.c

AD.h

电机驱动程序

舵机驱动


一,前言

  当今生活中,风扇已成为人们解暑的重要工具,然而使用风扇缓解夏日酷热的同时也存在着一些问题,传统风扇只能根据选择的档位来设置转速,而不能根据周围环境温度的变化而自动调节转速。基于以上设计了自动调速风扇系统。

二,系统方案选择

本系统由按键控制和液晶显示两部分组成。工作区内由单片机stm32F103C8热敏电阻传感器,当温度达到设定阈值时,从而通过PWM控制电机做相应动作。

环境温度采集模块:采用热敏电阻,可满足 40 摄氏度至 90 摄氏度测量范围

电机模块:采用舵机同直流电机搭配,舵机具有扭力大容易控制。小型直流减速电机,减速电机控制精度低,且速度均匀性好,控制简单,电源要求低,易于实现。

T86612FNG电机驱动   ,直流电机130

显示模块:OLED显示屏,快速插接小巧设计,是内容显示和程序调试的利器,从此程序清晰可见。

舵机:SG90

 如图2为STM32F103单片机最小系统电路原理图。该最小系统电路主要包括时钟、按键复位和供电电路三部分。

三,实体展示

工程分类

 

 

 

 四,相关代码

PWM.c

  1. #include "stm32f10x.h" // Device header
  2. void PWM_Init1(void)
  3. {
  4. GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO初始化结构体变量
  5. TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
  6. TIM_OCInitTypeDef TIM_OCInitStructure;
  7. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //开启定时器2
  8. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//通道2时钟使能函数
  9. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //设置GPIO为推挽输出模式
  10. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //PA1 PA2
  11. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度设置为 50MHz
  12. GPIO_Init(GPIOA, &GPIO_InitStructure); //按照以上参数进行 GPIO的初始化
  13. TIM_InternalClockConfig(TIM2);//TIM的时基单元由内部时钟控制
  14. TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  15. TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
  16. TIM_TimeBaseInitStructure.TIM_Period = 20000 - 1; //ARR 自动重装器的值
  17. TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1; //PSC 预分频器的值 对72M(720000000)进行 7200分频 即10K的频率下 计10000个数 1s的时间
  18. TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//重复计数器的值 CCR
  19. TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
  20. TIM_OCStructInit(&TIM_OCInitStructure);
  21. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  22. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//输出极性选择
  23. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出状态使能
  24. TIM_OCInitStructure.TIM_Pulse = 20;//CCR,即占空比为 10%
  25. TIM_OC2Init(TIM2,&TIM_OCInitStructure);//OC编号要与通道编号对应
  26. TIM_Cmd(TIM2,ENABLE);
  27. }
  28. void PWM_Init(void)
  29. {
  30. GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO初始化结构体变量
  31. TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
  32. TIM_OCInitTypeDef TIM_OCInitStructure;
  33. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //开启定时器3
  34. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//通道2时钟使能函数
  35. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //设置GPIO为推挽输出模式
  36. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //
  37. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度设置为 50MHz
  38. GPIO_Init(GPIOB, &GPIO_InitStructure); //按照以上参数进行 GPIO的初始化
  39. TIM_InternalClockConfig(TIM3); //内部时钟配置
  40. TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  41. TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
  42. TIM_TimeBaseInitStructure.TIM_Period = 100 - 1; //ARR 自动重装器的值
  43. TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1; //PSC 预分频器的值
  44. TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//重复计数器的值 CCR
  45. TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
  46. TIM_OCStructInit(&TIM_OCInitStructure);
  47. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  48. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//输出极性选择
  49. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出状态使能
  50. TIM_OCInitStructure.TIM_Pulse = 50;//CCR,即占空比为 10%
  51. TIM_OC3Init(TIM3,&TIM_OCInitStructure);//OC编号要与通道编号对应
  52. //TIM_OC2Init(TIM3,&TIM_OCInitStructure);//OC编号要与通道编号对应
  53. TIM_Cmd(TIM3,ENABLE);
  54. }
  55. void PWM_SetCompare_Servo(uint16_t Compare) //舵机
  56. {
  57. TIM_SetCompare2(TIM2, Compare);
  58. }
  59. void PWM_SetCompare_Motor(uint16_t Compare) //风扇
  60. {
  61. TIM_SetCompare3(TIM3, Compare);
  62. }

PWM.h

  1. #ifndef __PWM_H
  2. #define __PWM_H
  3. void PWM_Init(void);
  4. void PWM_Init1(void);
  5. void PWM_SetCompare_Motor(uint16_t Compare);
  6. void PWM_SetCompare_Servo(uint16_t Compare);
  7. #endif

AD.c

  1. #include "stm32f10x.h" // Device header
  2. void AD_Init(void)
  3. {
  4. RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  5. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  6. RCC_ADCCLKConfig(RCC_PCLK2_Div6);
  7. GPIO_InitTypeDef GPIO_InitStructure;
  8. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  9. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  10. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  11. GPIO_Init(GPIOA, &GPIO_InitStructure);
  12. ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
  13. ADC_InitTypeDef ADC_InitStructure;
  14. ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  15. ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  16. ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  17. ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
  18. ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  19. ADC_InitStructure.ADC_NbrOfChannel = 1;
  20. ADC_Init(ADC1, &ADC_InitStructure);
  21. ADC_Cmd(ADC1, ENABLE);
  22. ADC_ResetCalibration(ADC1);
  23. while (ADC_GetResetCalibrationStatus(ADC1) == SET);
  24. ADC_StartCalibration(ADC1);
  25. while (ADC_GetCalibrationStatus(ADC1) == SET);
  26. }
  27. uint16_t AD_GetValue(void)
  28. {
  29. ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  30. while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
  31. return ADC_GetConversionValue(ADC1);
  32. }

AD.h

  1. #ifndef __AD_H
  2. #define __AD_H
  3. void AD_Init(void);
  4. uint16_t AD_GetValue(void);
  5. #endif

电机驱动程序

  1. #include "stm32f10x.h" // Device header
  2. #include "PWM.h"
  3. #include "Delay2.h"
  4. #include "OLED.h"
  5. #include "LED1.h"
  6. #include "Key.h"
  7. float Speed=0;
  8. void Motor_Init(void)
  9. {
  10. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  11. GPIO_InitTypeDef GPIO_InitStructure;
  12. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  13. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
  14. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  15. GPIO_Init(GPIOA, &GPIO_InitStructure);
  16. PWM_Init1();
  17. }
  18. void Motor_SetSpeed(int8_t Speed)
  19. {
  20. if (Speed >= 0)
  21. {
  22. GPIO_ResetBits(GPIOA, GPIO_Pin_4);
  23. GPIO_SetBits(GPIOA, GPIO_Pin_5);
  24. PWM_SetCompare_Motor(Speed);
  25. }
  26. else
  27. {
  28. GPIO_SetBits(GPIOA, GPIO_Pin_4);
  29. GPIO_ResetBits(GPIOA, GPIO_Pin_5);
  30. PWM_SetCompare_Motor(-Speed);
  31. }
  32. }
  33. void Motor_Speed_Set(uint8_t KeyNum)
  34. {
  35. //Key_Init1();
  36. //Key_Init();
  37. //KeyNum = Key_GetNum();
  38. if(KeyNum == 1)
  39. {
  40. Speed += 20;
  41. if(Speed > 80)
  42. {
  43. Speed =0;
  44. }
  45. }
  46. void LED11_OFF(void);
  47. void LED22_ON(void);
  48. OLED_ShowNum(3,7,Speed,3);
  49. OLED_ShowNum(2,8,KeyNum,1);
  50. Motor_SetSpeed(Speed);
  51. }

舵机驱动

  1. #include "stm32f10x.h" // Device header
  2. #include "PWM.h"
  3. #include "OLED.h"
  4. #include "Key.h"
  5. #include "LED1.h"
  6. float Angle;
  7. void Servo_Init(void)
  8. {
  9. PWM_Init();
  10. }
  11. void Servo_SetAngle(float Angle)
  12. {
  13. PWM_SetCompare_Servo(Angle / 180 * 2000 + 500);
  14. }
  15. void Servo_Turn(uint8_t KeyNum)
  16. {
  17. KeyNum = Key_GetNum();
  18. if (KeyNum == 2)
  19. {
  20. Angle += 30;
  21. if (Angle > 180)
  22. {
  23. Angle = 0;
  24. }
  25. }
  26. Servo_SetAngle(Angle);
  27. OLED_ShowNum(2,8,KeyNum,1);
  28. OLED_ShowNum(1, 7, Angle, 3);
  29. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/770846
推荐阅读
相关标签
  

闽ICP备14008679号