① 单片机风扇调速原理
通过变阻调速,接收温度传感器传来的信号进行控制。
② 怎样实现51单片机根据温度动态控制风扇转速,请高手帮帮忙!
给您思路:第一,你需要使用温控元件测温,比如DS18B20温度传感器。
第二:你所需要使用的控制芯片可以选择单片机,比如STC89C55(带掉电参数保存功能)。
第三:使用数码管或者LCD1602显示您所检测的温度或者显示您所需要设置的温度范围。
第四:按键,根据你所需要的温度范围,根据按键来设置参数范围。
第五:使用定时器1或者2输出PWM波,控制可控硅(BTA06等),根据您的电流大小吧。
第七:在单片机里处理您的各类控制。大概就是如此吧。
③ 用单片机控制风扇的转速希望提供具体电路,我是新手希望大家多多帮助!!!
直流电机调速的技术是很常见的。。
不过当然不是用电阻,那样会有巨大的损耗。
一般直流电机调速都采用PWM(即脉宽调制)技术。
即,首先在电源和电机之间串联一个开关电子器件(比如mosfet管、达林顿管),这种器件可以以极高的速度控制电路通断。然后,我利用模拟电路或者数字电路(现在多用单片机)来控制这个开关管就能控制电机的电功率。比如,我想让电机工作电压只有电源电压的一半,我可以以1毫秒为周期,让开关管通0.5毫秒,断0.5毫秒,这样快速的电压波动在经过电机转子电枢这一有惯性的元件后就被“抹平”了,而且平均下来电压正好是电源的1/2,这就达到了控制电机输出功率的目的。[1]
开关元件可以在淘宝上买到现成的模块。其中最常用的是L298N做的电机控制板(楼上图中上方的那个就是),有两路双向调速(用H桥实现)的输出,单路最大电流2A,工作电压是12V以下(记不清是12还是24,你查一下。。)。如果需要更大功率,可以找BTS7960做的模块,容量是40A。。。
至于单片机,如果你有51可以用,学学定时器中断和IO操作,然后网上51 PWM的资料很多。。当然arino更不错(楼上图中下方的那个就是,不过是山寨的,正版是蓝色的,淘宝搜),除了AVR性能更好之外,IDE自带的驱动函数也挺方便。我记得51是没有硬件PWM端口的,而AVR有,在Arino IDE中直接调现成函数就能用。。。
参考资料:[1]来自我以前的原创回答
④ 单片机控制 12V 0.3A的直流无刷电机(风扇) 如何驱动
单片机控制 12V 0.3A的直流无刷电机(风扇) 驱动分为高电平驱动和低电平驱动:
电平驱动IO 口 经一个2K的电阻 ,接到一个三极管 b ,风扇正极接 12V+,风扇负极接三极管 c , 三极管 e接GND (三极管 用NPN 8050 )。
电动机的转子上粘有已充磁的永磁体 ,为了检测电动机转子的极性,在电动机内装有位置传感器。驱动器由功率电子器件和集成电路等构成,其功能是:接受电动机的启动、停止、制动信号,以控制电动机的启动、停止和制动。
直流无刷电机的维护
1、在拆卸前,要用压缩空气吹净电机表面灰尘,并将表面污垢擦拭干净。
2、为了进一步了解电机运行中的缺陷,有条件时可在拆卸前做一次检查试验。
3、切断电源 ,拆除电机外部接线,做好记录。
4、选用合适电压的兆欧表测试电机绝缘电阻 。为了跟上次检修时所测的绝缘电阻值相比较以判断电机绝缘变化趋势和绝缘状态,应将不同温度下测出的绝缘电阻值换算到同一温度,一般换算至75℃。
5、测试吸收比K。当吸收比大于1.33时,表明电机绝缘不曾受潮或受潮程度不严重。为了跟以前数据进行比较,同样要将任意温度下测得的吸收比换算到同一温度。
⑤ 怎么实现用单片机控制家用电风扇的转速
家用电风扇是单相电机,使用at89C2051之类的单片机,外加过零检测电路,再外加双向可控硅,由单片机驱动三极管,三极管驱动可控硅,就可达到调速目的。
基本原理,类似于调光灯电路,过零检测电路检测交流电过零时间,然后控制可控硅导通时间,可控硅导通点越接近过零点,风扇转速越快。
⑥ 怎么实现用单片机控制家用电风扇(单相交流电机)的转速,有具体的电路图可供参考吗
家用风扇一般只有1,2,3,4,5档速度如果要无级变速例如要求速度为0到2000圈每分,那么就复杂了,钱多的话买个单相变频器即可,自己设计的话…………难度大首先要把交流电变为直流电就很简单用用个二极管即可,然后要调节直流后的电压,整流后的电压为200到300伏如果转速降低那么整流后的电压也要降低,否则会烧坏风扇,解决了调节电压后就可以逆变了把直流电变为交流电,这要脉冲发生器,可以说用单片机控制最合适了,也是因为电路这个原因所以常用的家用风扇都是多级调速而不是无级变速的
⑦ ESP8285怎么结合单片机来控制风扇的启动和停止呢
⑧ 单片机控制风扇调速 具体点最好有源码就好
#include <iom16v.h>
#include <macros.h>
#define OVER_TEMPERATURE 0x01
#define LOW_LIGHT 0X02
#define HIGH_LIGHT 0X03
#define THIS_NODE 0x12
#define CENTRAL_SITE 0x18
#define LIGHT_NODE 0x11
#define OBJ 90
/*#define KP 15
#define KI 1
#define KD 20
#define P (KP + KI + KD)
#define I (KP + 2 * KD)
#define D KD*/
typedef unsigned char uchar;
typedef unsigned int uint;
uint KP = 5;
uchar dKP = 1;
uint KI = 1;
uchar dKI = 2;
uint KD = 3;
uchar dKD = 1;
uchar table[10] = {0xf3, 0x50, 0xcb, 0xd9, 0x78, 0xb9, 0xbb, 0xd0, 0xfb, 0xf9};
uchar node[7] = {0x00, 0x0d, 0x6f, 0x00, 0x0c, 0x08, 0x09};
uchar rcv_buf[4] = {0, 0, 0, 0};
uchar command = 0;
uchar uart_flag = 0;
uchar sec = 0;
uchar minute = 0;
uchar hour = 0;
uchar wakeup = 1;
uchar key_down[4] = {0, 0, 0, 0};
uchar key_up[4] = {0, 0, 0, 0};
uchar pre_key = 0;
uchar cur_key = 0;
uchar key_chg = 0;
uchar time_chg = 0;
uchar key_timer = 0;
uchar uart_isr = 0;
typedef struct _PID{
uint set_point;
uint B;
int ek[3];
int ek_flag[3];
uint uk;
}PID;
PID sPID;
int abs(int num)
{
return ((num>0)?(num):(-num));
}
int delta_PID(PID *pp, int next_point)//增量法
{
int error;
error = pp->set_point - next_point;
pp->ek[2] = pp->ek[1];
pp->ek[1] = pp->ek[0];
pp->ek[0] = error;
return (KP*pp->ek[0] - KI*pp->ek[1] + KD*pp->ek[2]);
}
void PIDproc(PID *pp, int next_point) //带死区控制以及抗积分饱和的PID
{
uint tmp[3] = {0, 0, 0};
uint PosSum = 0;
uint NegSum = 0;
uchar gain = 1;
if(pp->set_point > next_point){
tmp[0] = pp->set_point - next_point;//ek0
if(tmp[0] > pp->B){
pp->ek[2] = pp->ek[1];
pp->ek[1] = pp->ek[0];
pp->ek[0] = tmp[0];
pp->ek_flag[2] = pp->ek_flag[1];
pp->ek_flag[1] = pp->ek_flag[0];
pp->ek_flag[0] = 0; //当前EK为正数
tmp[0] = KP * pp->ek[0] / dKP + KI * pp->ek[0] / dKI + KD * pp->ek[0] / dKD; // KP*EK0
tmp[1] = KP * pp->ek[1] / dKP + 2 * KD * pp->ek[1] / dKD; // KI*EK1
tmp[2] = KD * pp->ek[2] / dKD; // KD*EK2
}
}
else{ //反馈大于给定
tmp[0] = next_point - pp->set_point;//ek0
if(tmp[0] > pp->B){
//数值移位
pp->ek[2] = pp->ek[1];
pp->ek[1] = pp->ek[0];
pp->ek[0] = tmp[0];
//符号移位
pp->ek_flag[2] = pp->ek_flag[1];
pp->ek_flag[1] = pp->ek_flag[0];
pp->ek_flag[0] = 1; //当前EK为负数
tmp[0] = KP * pp->ek[0] / dKP + KI * pp->ek[0] / dKI + KD * pp->ek[0] / dKD; // KP*EK0
tmp[1] = KP * pp->ek[1] / dKP + 2 * KD * pp->ek[1] / dKD; // KI*EK1
tmp[2] = KD * pp->ek[2] / dKD; // KD*EK2
}
}
/*以下部分代码是讲所有的正数项叠加,负数项叠加*/
if(pp->ek_flag[0]==0){
PosSum += tmp[0]; //正数和
}
else{
NegSum += tmp[0]; //负数和
} // KP*EK0
if(pp->ek_flag[1]!=0){
PosSum += tmp[1]; //正数和
}
else{
NegSum += tmp[1]; //负数和
} // - kI * EK1
if(pp->ek_flag[2]==0){
PosSum += tmp[2]; //正数和
}
else{
NegSum += tmp[2]; //负数和
} // KD * EK2
PosSum += pp->uk; //
if(PosSum > NegSum){ // 是否控制量为正数
tmp[0] = PosSum - NegSum;
tmp[0] *= gain;
if( tmp[0] < (uint)65000){ //小于限幅值则为计算值输出
pp->uk = tmp[0];
}
else{
pp->uk = (uint)65000; //否则为限幅值输出
}
}
else{ //控制量输出为负数,则输出0
pp->uk = 0;
}
}
void PID_init(PID* pp)
{
pp->set_point = OBJ;
pp->B = 0;
pp->ek[0] = 0;
pp->ek[1] = 0;
pp->ek[2] = 0;
pp->ek_flag[0] = 0;
pp->ek_flag[1] = 0;
pp->ek_flag[2] = 0;
pp->uk = 0;
}
void delay(int n)
{
int i = 0, j = 0;
for(i = 0; i < n; i++)
for(j = 0; j < 1000; j++);
}
void disp(int a)
{
uchar flag = 0;
PORTC = 0X01;
PORTB = table[a / 1000];
delay(3);
PORTB = 0X00;
PORTC = 0X02;
PORTB = table[a / 100 % 10];
delay(3);
PORTB = 0X00;
PORTC = 0X04;
PORTB = table[a / 10 % 10];
delay(3);
PORTB = 0X00;
PORTC = 0X08;
PORTB = table[a % 10];
delay(3);
PORTB = 0X00;
}
void delay_on(int n, uchar cur_val)
{
int i = 0, j = 0;
for(i = 0; i < n; i++)
for(j = 0; j < 30; j++)
disp(cur_val);
}
void uart0_init(void)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
UCSRC = 0x06;//BIT(URSEL) | 0x06;
UBRRL = 0x0b; //set baud rate lo 0x03:115.2k,0x17:19200,0x0b:38400
UBRRH = 0x00; //set baud rate hi
UCSRB = 0x98;
}
// 数据发送【发送5 到8 位数据位的帧】
void USART_Transmit( unsigned char data )
{
while ( !( UCSRA & (1<<UDRE)));
UDR = data;
}
// 数据接收【以5 到8 个数据位的方式接收数 据帧】
unsigned char USART_Receive( void )
{
while (!(UCSRA & (1<<RXC)));
return UDR;
}
void USART_TranStr(uchar data[], uchar n)
{
uchar i = 0;
for(i = 0; i < n; i++)
{
USART_Transmit(data[i]);
}
}
#pragma interrupt_handler uart_rx_isr:iv_USART_RX
void uart_rx_isr(void)
{
uchar i;
for(i = 0; i < 4; i++)
{
rcv_buf[i] = USART_Receive();
}
uart_flag = 1;
}
void scankey(void)
{
uchar tmp = 0;
DDRD &= ~0X04;
DDRC = (DDRC & 0X0F) | 0XC0;
PORTD |= 0X04;
PORTC = (PORTC & 0X0F) | 0X70;
delay(2);
tmp = PINC;
if((~tmp & 0x30) != 0)
delay(2);
tmp = PINC;
if((~tmp) & (1 << 4)){
key_timer = 0;
cur_key = 2;//test
return;
}
if((~tmp) & (1 << 5)){
key_timer = 0;
cur_key = 1;//up
return;
}
PORTC = (PORTC & 0X0F) | 0Xb0;
delay(2);
tmp = PINC;
if((~tmp & 0x30) != 0)
delay(2);
tmp = PINC;
if((~tmp) & (1 << 4)){
key_timer = 0;
cur_key = 4;//switch
return;
}
if((~tmp) & (1 << 5)){
key_timer = 0;
cur_key = 3;//time
return;
}
cur_key = 0;
}
void decidekey(void)
{
if(cur_key==0 && pre_key != 0)
{
key_up[pre_key - 1] = 1;
key_chg = 1;
}
else if(cur_key!=0 && pre_key==0)
{
key_down[cur_key - 1] = 1;
key_chg = 1;
}
else
{
key_chg = 0;
}
pre_key = cur_key;
}
void port_init(void)
{
DDRB = 0xFF;
PORTB = 0X00;
DDRC |= 0X0F;
PORTC = 0X00;
DDRA |= 0X30;
PORTA &= ~0X30;
}
void sendto(uchar no, uchar data[], uchar n)
{
USART_TranStr(node, 7);
USART_Transmit(no);
USART_TranStr(data, n);
}
void zigbeeReset(void)
{
USART_TranStr("AT+RESET", 8);
}
void zigbeeSleep(uchar TH, uchar TL)
{
uchar sleep[] = {"AT+SLEEP="};
USART_TranStr(sleep, 9);
USART_Transmit(TH);
USART_Transmit(TL);
}
void setrelay(uchar op)
{
uchar setRelay[] = {"AT+SETRELAY="};
USART_TranStr(setRelay, 12);
USART_Transmit(op);
}
void timer1_init(void)
{
TCCR1A = 0xa2; //两路PWM,匹配清零
TCCR1B = 0x19; //快速PWM模式,位数可调,预分频1
ICR1 = 0xFFFF;
//计数上限值,此数为16位PWM,此值的多少决定PWM的位数,改变值可以改变时钟的输入频率
//在1M时钟下,OCR1A,OCR1B=1M/65536=15HZ。改为7FFF时,为30HZ,ICR1变小,OCR1A,B成比例变大
}
void main()
{
uchar data[] = {0x01};
uchar time[] = {0x03, 21, 14, 55};
uchar send_buf[] = {0x05, 0x01, 0x00, 0x00};
uchar oldcomm[] = {0x00};
uchar flag = 0;
uchar light_obj = 500;
int a = 0;
uint PID_out = 0;
uint pre_PID_out = 0;
int delta_PID_out = 0;
int PID_in = 0;
int disp_num = 0;
CLI();
PID_init(&sPID);
uart0_init();
timer1_init();
MCUCR = 0x00;
GICR = 0x00;
OCR1A = a;
//OCR1B=a; //匹配初值
DDRA |= 0X20;
PORTA = 0X00;
DDRD |= 0XF8;
PORTD &= ~0XF8;
port_init();
SEI();
delay(1000);
sendto(LIGHT_NODE, send_buf, 4);
while(1)
{
if(uart_flag == 1)
{
uart_flag = 0;
PID_in = 255 - rcv_buf[1];// * 4 - rcv_buf[2];
/*pre_PID_out = PID_out;
delta_PID_out = delta_PID(&sPID, PID_in);
PID_out += delta_PID_out;
OCR1A = PID_out;*/
PIDproc(&sPID, PID_in);
OCR1A = sPID.uk;
sendto(LIGHT_NODE, send_buf, 4);
}
scankey();
decidekey();
if(key_chg && key_up[0])
{
key_up[0] = 0;
sPID.set_point += 10;
sendto(LIGHT_NODE, send_buf, 4);
}
if(key_chg && key_up[1])
{
key_up[1] = 0;
sPID.set_point -= 10;
sendto(LIGHT_NODE, send_buf, 4);
}
if(key_chg && key_up[2])
{
key_up[2] = 0;
disp_num = 0;
}
if(key_chg && key_up[3])
{
key_up[3] = 0;
disp_num = 1;
}
(disp_num == 0)?disp(PID_in):disp(PID_out / 10);
}
}//这是PID调节光照的,你自己慢慢看看,道理差不多
⑨ 如何用单片机来控制电风扇的温度控制
温度传感器
可以自己做,用二极管或者
热敏元件
。这样用AD采集确定温度。
花5元以上的可以选择买18b20,使用iiC接口得到温度。
控制风扇的转速,需要调压。建议买个现成的调压电路来用,自己做很花时间。
⑩ 单片机实现对风扇的控制
会的,你可以在电路中加个触发器,让触发器控制,这样可以实现的,但是就是硬件方面增加了!