91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第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< 審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6067

    文章

    44991

    瀏覽量

    650386
  • 空調
    +關注

    關注

    11

    文章

    1262

    瀏覽量

    59591
  • cpu
    cpu
    +關注

    關注

    68

    文章

    11080

    瀏覽量

    217040
  • PWM
    PWM
    +關注

    關注

    116

    文章

    5511

    瀏覽量

    219375
  • 風扇
    +關注

    關注

    4

    文章

    427

    瀏覽量

    38185

原文標題:基于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 ?34次下載

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

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

    基于WinCE通知API的解析及在控制程序中的應用

    基于WinCE通知API的解析及在控制程序中的應用
    發表于 10-25 09:42 ?3次下載
    基于WinCE通知API的解析及在<b class='flag-5'>控制程序</b>中的應用

    直流無刷電機控制程序

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

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

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

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

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

    FMEA控制程序

    電子發燒友網站提供《FMEA控制程序.doc》資料免費下載
    發表于 10-10 11:48 ?2次下載
    主站蜘蛛池模板: 久久久久久人精品免费费看 | 77788色淫视频免费观看 | 9久久99久久久精品齐齐综合色圆 | 巨乳色在线观看 | 永久免费的啪啪免费的网址 | 在线观看不卡一区 | 在线a亚洲老鸭窝天堂新地址 | 天天摸日日碰天天看免费 | 1024你懂的日韩 | 99久久99这里只有免费费精品 | 天天艹| 一级一级特黄女人精品毛片 | 亚洲第二页 | 成人久久久久久 | 亚洲一本高清 | 欧美人与动欧交视频 | 国产精品久久久久影院色老大 | 99久久婷婷国产综合精品电影 | 狠狠操狠狠 | 在线观看精品视频看看播放 | 韩国三级理论在线观看视频 | 日本黄页网 | 亚洲免费色 | 免费午夜在线视频 | 国产成人综合亚洲怡春院 | gay超刺激污文 | 色婷婷久久久swag精品 | 色婷婷综合激情 | 久久艹影院 | 成人在色线视频在线观看免费大全 | 丁香亚洲综合五月天婷婷 | 日本不卡在线视频高清免费 | 欧美成人午夜视频 | 天天摸夜夜摸成人免费视频 | 六月激情 | 男人天堂伊人网 | 天堂资源中文在线 | 久久美女精品国产精品亚洲 | 欧美成人精品一区二三区在线观看 | 国产女同 | 美女被免网站在线视频 |