在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于STM8的PWM風扇控制程序分享

jf_eqg0Ui2u ? 來源:懂事電子設計 ? 2023-06-29 15:04 ? 次閱讀

炎炎夏日沒有空調怎么辦

找來了兩個電腦DC12V的CPU散熱器風扇。風扇一共四根線,紅色:電源+、黑色:電源-、黃色:轉速信號線、藍色:PWM信號線。

后面又找了紅外遙控、數碼管、STM8最小板、紅外熱釋電傳感器。準備做一個簡易的遙控風扇(讓這個夏天清涼一下)。

單片機模塊用的1117-3.3V穩壓器,而風扇需要使用12V供電傳感器模塊需要使用5V供電,所以第一步就是在單片機模塊輸入端加一個78M05,產生一個5V直流給外設模塊供電。

然后再把紅外信號接收管焊接上。

再然后就是數碼管模塊和紅外熱釋電傳感器(中間忘記拍照了就不貼圖了)。最后的最后給它弄個外殼。

效果就是上面圖的樣子。

然后就是程序部分,風扇速度就不檢測了,但是調速還是要弄的。調速的原理就是發PWM波,通過改變PWM波的占空比來實現調速。這里就利用STM8的定時器PWM功能產生兩個頻率為25KHz的方波。然后檢測IO和定時器完成紅外遙控信號的接收及解碼。紅外解碼原理都爛大街了,這里就不解釋了。紅外解碼程序也是用的網絡大神的。然后就是紅外熱釋電傳感器的檢測,就是普通IO信號的檢測,也沒什么好多說的。

下面貼的是主程序部分。

/**
  ******************************************************************************
  * @file    Project/main.c 
  * @author  MCD Application Team
  * @version V2.1.0
  * @date    18-November-2011
  * @brief   Main program body
  ******************************************************************************
  * @attention
  *
  * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
  * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  *
  * 

? COPYRIGHT 2011 STMicroelectronics

****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "stm8s.h" #include "TM1637.h" #include "math.h" /* Private defines -----------------------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/ //#define LED_GPIO_PORT (GPIOB) //#define LED_GPIO_PINS (GPIO_PIN_5) //紅外解碼IO #define IR_IN GPIOA->IDR & (GPIO_PIN_2) //紅外熱釋電 #define PIR_IN GPIOD->IDR & (GPIO_PIN_2) uint16_t sleep_cnt = 0 ; uint16_t i=0; uint8_t sample_flag = 0 ; uint8_t sample_cnt = 0 ; #define CCR1_Val ((uint16_t)800) // uint8_t fan1_speed = 0 ; uint8_t fan2_speed = 0 ; // uint8_t fan1_state = 0 ; uint8_t fan2_state = 0 ; uint8_t display_buff[5] = {0,0,0,0,0}; uint8_t enable_display = 0 ; uint8_t fan1_buff = 0xff ; uint8_t fan2_buff = 0xff ; uint8_t mode = 0 ; uint16_t PIR_Delay = 0 ; uint8_t PIR_REG = 0 ; uint8_t PIR_OFF = 0 ; //**********************紅外解碼部分變量 uint16_t LongKeyCount ; uint8_t IrData[20]; uint8_t IrOkFlag ; uint8_t IrTime ; uint16_t Time1msCount ; uint16_t DelayTime ; //****************************************************************************// /* Private defines -----------------------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/ //IO初始化 void Init_GPIO(void) { GPIO_Init(GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_FAST); GPIO_Init(GPIOA, GPIO_PIN_2, GPIO_MODE_IN_PU_NO_IT); GPIO_Init(GPIOD, GPIO_PIN_4, GPIO_MODE_OUT_PP_HIGH_FAST); GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_PP_HIGH_FAST); GPIO_Init(GPIOD, GPIO_PIN_2, GPIO_MODE_IN_PU_NO_IT); } //定時器4初始化 void Init_Timer4(void) { /*TIM4_UpdateDisableConfig(ENABLE);//允許更新事件 TIM4_ARRPreloadConfig(ENABLE);//自動重裝 TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);//中斷配置,更新中斷 TIM4_SetCounter(0xff);//計數器初值 TIM4_SetAutoreload(0xFF);//計數器自動重裝的初值 TIM4_PrescalerConfig(TIM4_PRESCALER_128, TIM4_PSCRELOADMODE_UPDATE);//預分頻值 */ TIM4_TimeBaseInit(TIM4_PRESCALER_16, 0x32); //定時器4,50us中斷定時 /* Clear TIM4 update flag */ TIM4_ClearFlag(TIM4_FLAG_UPDATE); /* Enable update interrupt */ TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE); TIM4_Cmd(ENABLE); } /*************************************** * TIMER2初始化 * 檢測外部頻率和脈沖 ***************************************/ void timer2_init(void) { TIM2_DeInit(); TIM2_TimeBaseInit(TIM2_PRESCALER_16, 40-1); TIM2_OC1Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE, 0, TIM2_OCPOLARITY_HIGH); TIM2_OC2Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE, 0, TIM2_OCPOLARITY_HIGH); /* TIM1 counter enable */ TIM2_Cmd(ENABLE); } uint8_t get_value(uint8_t spd) { uint8_t buf ; switch(spd) { case 0 : buf = 0 ; break ; case 1 : buf = 20 ;break ; case 2 : buf = 22 ;break ; case 3 : buf = 24 ;break ; case 4 : buf = 28 ;break ; case 5 : buf = 30 ;break ; case 6 : buf = 32 ;break ; case 7 : buf = 34 ;break ; case 8 : buf = 36 ;break ; case 9 : buf = 39 ;break ; default : buf = 0 ; } return buf ; } //設置兩個風扇速度 void set_speed(uint8_t spd1,uint8_t spd2) { uint8_t pwm_dat1,pwm_dat2; pwm_dat1 = get_value(spd1); pwm_dat2 = get_value(spd2); TIM2_SetCompare1(pwm_dat1); TIM2_SetCompare2(pwm_dat2); } void fan_run(void) { display_buff[0] = (fan1_buff>>7)&0x01|((fan1_buff>>1)&0x38); display_buff[1] = 0x0f&fan1_buff ; display_buff[2] = (fan2_buff>>7)&0x01|((fan2_buff>>1)&0x38); display_buff[3] = 0x0f&fan2_buff ; } //遙控按鍵處理函數 void key_handling(uint8_t key_value) { switch(key_value) { case 0x43 : enable_display = 1 ; break ; case 0x09 : enable_display = 0 ; break ; case 0x44 : fan1_state = 1 ; fan1_speed=9;set_speed(fan1_speed,fan2_speed);break ; case 0x40 : fan2_state = 1 ; fan2_speed=9;set_speed(fan1_speed,fan2_speed);break ; case 0x07 : fan1_state = 0 ; fan1_speed=0;set_speed(fan1_speed,fan2_speed);PIR_OFF = 0 ;break ; case 0x15 : fan2_state = 0 ; fan2_speed=0;set_speed(fan1_speed,fan2_speed);PIR_OFF = 0 ;break ; case 0x46 : mode = 0 ; break ; case 0x45 : if(fan1_state==1)mode = 1 ; break ; case 0x47 : if(fan2_state==1)mode = 2 ; break ; case 0x19 : fan1_state = 1 ; fan1_speed=9;fan2_state = 1 ; fan2_speed=9;set_speed(fan1_speed,fan2_speed);break ; case 0x0d : fan1_state = 0 ; fan1_speed=0;fan2_state = 0 ; fan2_speed=0;set_speed(fan1_speed,fan2_speed);break ; case 0x16 : if(mode==1) fan1_speed = 0 ; else if(mode==2) fan2_speed = 0 ;set_speed(fan1_speed,fan2_speed); break ; case 0x0c : if(mode==1) fan1_speed = 1 ; else if(mode==2) fan2_speed = 1 ;set_speed(fan1_speed,fan2_speed); break ; case 0x18 : if(mode==1) fan1_speed = 2 ; else if(mode==2) fan2_speed = 2 ;set_speed(fan1_speed,fan2_speed); break ; case 0x5e : if(mode==1) fan1_speed = 3 ; else if(mode==2) fan2_speed = 3 ;set_speed(fan1_speed,fan2_speed); break ; case 0x08 : if(mode==1) fan1_speed = 4 ; else if(mode==2) fan2_speed = 4 ;set_speed(fan1_speed,fan2_speed); break ; case 0x1c : if(mode==1) fan1_speed = 5 ; else if(mode==2) fan2_speed = 5 ;set_speed(fan1_speed,fan2_speed); break ; case 0x5a : if(mode==1) fan1_speed = 6 ; else if(mode==2) fan2_speed = 6 ;set_speed(fan1_speed,fan2_speed); break ; case 0x42 : if(mode==1) fan1_speed = 7 ; else if(mode==2) fan2_speed = 7 ;set_speed(fan1_speed,fan2_speed); break ; case 0x52 : if(mode==1) fan1_speed = 8 ; else if(mode==2) fan2_speed = 8 ;set_speed(fan1_speed,fan2_speed); break ; case 0x4a : if(mode==1) fan1_speed = 9 ; else if(mode==2) fan2_speed = 9 ;set_speed(fan1_speed,fan2_speed); break ; default: ; } } //紅外解碼處理函數,在定時器4中斷中調用,移植自網絡 void Time4InitFun (void) { static unsigned char TimeL,TimeH; static unsigned char IoState,UpState; static unsigned char RxData[4]; static unsigned char BitCount,ByteCount; static unsigned char Task; unsigned char i; //TIM4_SR=0; //清標志 IoState =IR_IN; if(IoState){ if(TimeH<250)TimeH++; } else{ if(TimeL<250)TimeL++; } if((!IoState)&&(UpState)){ if(Task==0){ //收同步頭 if((TimeL<=(180+30))&&(TimeL>=(180-30))&&(TimeH<=(87+10))&&(TimeH>=(43-10))){ BitCount=0; ByteCount=0; if(LongKeyCount)LongKeyCount=3; Task++; } } else if(Task==1){ //收數據 if((TimeL<=(12+5))&&(TimeL>=(12-5))){ if((TimeH<=(12+5))&&(TimeH>=(12-5))) RxData[ByteCount] &= ~(1<=(32-8))) RxData[ByteCount] |= (1<=8){ BitCount=0; ByteCount++; if(ByteCount>=4){ ByteCount=0; for(i=0;i<4;i++){ IrData[i]=RxData[i]; IrOkFlag=1; Task=0; IrTime=5; LongKeyCount=3; //長鍵采樣 } } } } else{ Task=0; } } else{ Task=0; } TimeH=0; TimeL=0; } UpState=IoState; if(Time1msCount<250)Time1msCount++; if(DelayTime)DelayTime--; return; } //主函數 void main(void) { // ErrorStatus clk_return_status; //FlagStatus flag_status; u16 display_cnt = 0 ; uint8_t cnt = 0 ; /* Configuration -----------------------------------------*/ CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); //不分頻 CLK_HSICmd(ENABLE); //開始內部高頻RC Init_Timer4(); enableInterrupts(); GPIO_init(); TM1637_OFF(); timer2_init(); set_speed(fan1_speed,fan2_speed); sleep_cnt = 0 ; mode = 0 ; while (1) { if(PIR_IN) { display_buff[1] = display_buff[1]|0x80; PIR_REG = 1 ; if(PIR_OFF) { PIR_OFF = 0 ; fan1_speed=9; fan2_speed=9; fan1_state = 1 ; fan2_state = 1 ; set_speed(fan1_speed,fan2_speed); } }else { display_buff[1] = display_buff[1]&0x7f; PIR_REG = 0 ; } //********************************************************************** if(sample_flag==1) //20毫秒執行一次 { sample_flag = 0 ; display_cnt++; } //********************************************************************** if(IrOkFlag==1) { IrOkFlag = 0 ; key_handling(IrData[2]); } //********************************************************************** if(display_cnt>10) { display_cnt=0; if((fan1_state==1||fan2_state==1)) { if(PIR_REG==0) { PIR_Delay++; } if(PIR_Delay>=1000) { fan1_state = 0 ; fan2_state = 0 ; fan1_speed=0; fan2_speed=0; set_speed(fan1_speed,fan2_speed); PIR_OFF = 1 ; } }else { PIR_Delay = 0 ; } if(enable_display) { TM1637_DHex(display_buff); }else { TM1637_OFF(); } cnt ++ ; if(cnt>=8) { cnt =0 ; } if(mode==0) { if(fan1_state) { fan1_buff = 0xff & (~(0x01< 審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6040

    文章

    44594

    瀏覽量

    636941
  • 空調
    +關注

    關注

    11

    文章

    1233

    瀏覽量

    58649
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10890

    瀏覽量

    212419
  • PWM
    PWM
    +關注

    關注

    114

    文章

    5196

    瀏覽量

    214373
  • 風扇
    +關注

    關注

    4

    文章

    414

    瀏覽量

    37462

原文標題:基于STM8的PWM風扇控制程序分享

文章出處:【微信號:懂事電子設計,微信公眾號:懂事電子設計】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    求單片機控制的自動門PWM控制程序

    求單片機控制的自動門PWM控制程序,平滑啟動,本人用的是直流無刷電機,紅外感應器,單位的項目,讓我寫程序,要求能平滑啟動。謝謝各位大俠。
    發表于 11-14 10:37

    步進電機控制程序(PLC控制)

    步進電機控制程序(PLC控制)
    發表于 10-10 14:35 ?65次下載
    步進電機<b class='flag-5'>控制程序</b>(PLC<b class='flag-5'>控制</b>)

    步進電機控制程序STEPPER.C

    步進電機控制程序ST
    發表于 01-09 15:19 ?7次下載

    機器人控制程序(舵機型)

    機器人控制程序(舵機型)機器人控制程序(舵機型)
    發表于 11-12 17:23 ?16次下載

    單片機按鍵控制程序【匯編版】

    單片機按鍵控制程序【匯編版】單片機按鍵控制程序【匯編版】單片機按鍵控制程序【匯編版】單片機按鍵控制程序【匯編版】
    發表于 12-29 11:04 ?0次下載

    多舵機控制程序

    多舵機控制程序
    發表于 03-21 15:43 ?12次下載

    各種電機的DSP控制程序

    各種電機的DSP控制程序,比較全,歡迎大家下載,歡迎交流,一起學習DSP。
    發表于 04-13 14:46 ?52次下載

    手勢控制程序

    這個是小車的手勢控制程序,通過單片機可以控制小車來進行活動,比如前進或者后退。
    發表于 05-11 11:30 ?23次下載

    步進電機控制程序液晶顯示程序

    步進電機控制程序液晶顯示程序,快來學習吧。
    發表于 05-12 16:25 ?33次下載

    小車電機控制程序的編寫要求

    小車電機控制程序
    發表于 02-27 16:43 ?14次下載

    直流無刷電機控制程序

    直流無刷電機控制程序(現代電源技術杜少武掃描版)-?直流無刷電機控制程序,可用在直流變頻空調上
    發表于 09-28 12:28 ?158次下載
    直流無刷電機<b class='flag-5'>控制程序</b>

    STM32f10xc8t6L智能小車藍牙避障完整PWM控制程序

    STM32f10xc8t6L智能小車藍牙避障完整PWM控制程序
    發表于 12-23 17:06 ?9次下載

    快速掌握PLC控制程序的設計

    快速掌握PLC控制程序的設計
    發表于 03-17 09:42 ?400次閱讀

    FMEA控制程序

    電子發燒友網站提供《FMEA控制程序.doc》資料免費下載
    發表于 10-10 11:48 ?2次下載

    6軸控制程序,帶串口通訊

    6軸控制程序,帶串口通訊。
    發表于 11-09 14:08 ?0次下載
    主站蜘蛛池模板: 亚洲永久免费视频| 欧美福利二区| 成人淫片| 在线中文天堂| 奇米7777影视| 777奇米影音| 韩国理论片在线看2828dy| 日本一区不卡视频| 亚洲欧美人成网站综合在线| 色婷婷亚洲综合五月| 欧美一级日韩在线观看| 久久综合99| 在线色片| 九九国产精品| 亚洲一区二区欧美| 伊人欧美在线| 日本三级免费网站| 国产农村妇女毛片精品久久久| 五月婷婷爱| 7777奇米影视| 人人爽人人澡| 四虎黄色网址| 国产一级特黄aaaa大片野外| 天天做天天爱夜夜爽女人爽宅| 一级一片免费视频播放| 性欧美xxxx乳高跟| 欧美一级特黄aaaaaaa在线观看| 狠狠色丁香六月色| 天天做天天干| 色网站在线播放| 波多野结衣中文字幕教师| 91国内在线视频| 亚洲瑟瑟网| 欧美激欧美啪啪片免费看| 国产成人亚洲综合a∨婷婷| 天天干 夜夜操| 六月激情丁香| 天堂资源在线bt种子8| 黄 色 免 费 网站在线观看| 日日爱网址| 视频一区二区三区在线观看|