stm32控制半导体制冷器实现饮水机保温制冷功能

半导体致冷器件是由半导体所组成的一种冷却装置,随着近代的半导体发展才有实际的应用,也就是致冷器的发明。其工作原理是由直流电源提供电子流所需的能量,通上电源后,电子负极(-)出发,首先经过P型半导体,于此吸热量,到了N型半导体,又将热量放出,每经过一个NP模块,就有热量由一边被送到令外一边造成温差而形成冷热端。冷热端分别由两片陶瓷片所构成,冷端要接热源,也就是欲冷却之。在以往致冷器是运用在CPU的,是利用冷端面来冷却CPU,而热端面散出的热量则必需靠风扇来排出。致冷器也应用于做成车用冷/热保温箱,冷的方面可以冷饮机,热的方面可以保温热的东西。

半导体制冷片的工作原理是基于帕尔帖原理,该效应是在1834年由J.A.C帕尔帖首先发现的,即利用当两种不同的导体A和B组成的电路且通有直流电时,在接头处除焦耳热以外还会释放出某种其它的热量,而另一个接头处则吸收热量,且帕尔帖效应所引起的这种现象是可逆的,改变电流方向时,放热和吸热的接头也随之改变,吸收和放出的热量与电流强度I成正比,且与两种导体的性质及热端的温度有关

设计要求使用一块制冷片实现制冷和保温,也就是要设计可以正向反向输出的电源,使用温度传感器采集温度,当接近设定温度时,逐步减小驱动电流,直到达到平衡为止。项目中使用两片IR2101S驱动NMOS实现H桥驱动电路,使用定时器PWM控制输出电流,驱动电路原理图如下。

主控采用STM32.关键程序如下

void TIM_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef	TIM_TimeBaseInitStruct;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
	
	NVIC_InitTypeDef NVIC_InitStructure;
	
	// ¿ªÆô¶¨Ê±Æ÷ʱÖÓ,¼´ÄÚ²¿Ê±ÖÓCK_INT=72M
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_TIM1, ENABLE);
	
   // Êä³ö±È½ÏͨµÀ1 GPIO ³õʼ»¯
	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8 | GPIO_Pin_9  ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
		
	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_13 | GPIO_Pin_14 ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
	GPIO_SetBits(GPIOB, GPIO_Pin_13);
	GPIO_ResetBits(GPIOB, GPIO_Pin_14);
	
	TIM_DeInit(TIM1);        //½«ÍâÉèTIM1¼Ä´æÆ÷ÖØÉèΪȱʡֵ  
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1 ;    //ÉèÖÃÁËʱÖÓ·Ö¸î(Tck_tim) 
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up ;   //Ñ¡ÔñÁ˼ÆÊýÆ÷ģʽ(TIMÏòÉϼÆÊýģʽ)  
	TIM_TimeBaseInitStruct.TIM_Period = 6005 ;       //É趨¼ÆÊýÆ÷×Ô¶¯ÖØ×°Öµ,È¡Öµ·¶Î§0x0000~0xFFFF   
	TIM_TimeBaseInitStruct.TIM_Prescaler = 71 ;    //ÉèÖÃÓÃÀ´×÷ΪTIM3ʱÖÓƵÂʳýÊýµÄÔ¤·ÖƵֵΪ(79+1),È¡Öµ·¶Î§0x0000~0xFFFF 
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStruct ) ;       
	
	/* ¶¨Ê±Æ÷Êä³öͨµÀ1ģʽÅäÖà */

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;/* ģʽÅäÖãºPWMģʽ1 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;	 /* Êä³ö״̬ÉèÖãºÊ¹ÄÜÊä³ö */
  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; /* »¥²¹Í¨µÀÊä³ö״̬ÉèÖãºÊ¹ÄÜÊä³ö */
  TIM_OCInitStructure.TIM_Pulse = 3000;/* ÉèÖÃÌø±äÖµ£¬µ±¼ÆÊýÆ÷¼ÆÊýµ½Õâ¸öֵʱ£¬µçƽ·¢ÉúÌø±ä */
  
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;/* µ±¶¨Ê±Æ÷¼ÆÊýֵСÓÚCCR1_ValʱΪ¸ßµçƽ */
  TIM_OCInitStructure.TIM_OCNPolarity= TIM_OCPolarity_High;
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCNIdleState_Reset;
  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
  
  TIM_OC1Init(TIM1, &TIM_OCInitStructure);
  
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;/* ģʽÅäÖãºPWMģʽ1 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;	 /* Êä³ö״̬ÉèÖãºÊ¹ÄÜÊä³ö */
  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; /* »¥²¹Í¨µÀÊä³ö״̬ÉèÖãºÊ¹ÄÜÊä³ö */
  TIM_OCInitStructure.TIM_Pulse = 3000;/* ÉèÖÃÌø±äÖµ£¬µ±¼ÆÊýÆ÷¼ÆÊýµ½Õâ¸öֵʱ£¬µçƽ·¢ÉúÌø±ä */
	
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;/* µ±¶¨Ê±Æ÷¼ÆÊýֵСÓÚCCR1_ValʱΪ¸ßµçƽ */
  TIM_OCInitStructure.TIM_OCNPolarity= TIM_OCPolarity_High;
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCNIdleState_Reset;
  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
	
	TIM_OC2Init(TIM1, &TIM_OCInitStructure);


  /* Automatic Output enable, Break, dead time and lock configuration*/
  TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
  TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
  TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
  TIM_BDTRInitStructure.TIM_DeadTime = 5;
  TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
  TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
  TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
  TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);
  
  TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);
  TIM_OC2PreloadConfig(TIM1,TIM_OCPreload_Enable);

	
  TIM_ARRPreloadConfig(TIM1, ENABLE);/* ʹÄܶ¨Ê±Æ÷ÖØÔؼĴæÆ÷ARR */
  TIM_Cmd(TIM1, ENABLE);/* ʹÄܶ¨Ê±Æ÷ */
  TIM_CtrlPWMOutputs(TIM1, ENABLE); /* TIMÖ÷Êä³öʹÄÜ */
  
  TIM_CCxCmd(TIM1,TIM_Channel_1,TIM_CCx_Enable);
  TIM_CCxNCmd(TIM1,TIM_Channel_1,TIM_CCxN_Enable);
  TIM_CCxCmd(TIM1,TIM_Channel_2,TIM_CCx_Enable);
  TIM_CCxNCmd(TIM1,TIM_Channel_2,TIM_CCxN_Enable);

}

根据设定温度值与采集温度值调节输出PWM占空比

if(SetTemperature>Temperature)
    	{
			if(((SetTemperature-Temperature)*1200)>6000)TIM_SetCompare1(TIM1,6000);
			else TIM_SetCompare1(TIM1,(SetTemperature-Temperature)*1200); 
			TIM_SetCompare2(TIM1,0); 
			TIM_CCxCmd(TIM1,TIM_Channel_1,TIM_CCx_Enable);
			TIM_CCxCmd(TIM1,TIM_Channel_2,TIM_CCx_Disable);
			GPIO_SetBits(GPIOB, GPIO_Pin_14);
			GPIO_ResetBits(GPIOB, GPIO_Pin_13);
		}
		if(SetTemperature<Temperature)
		{
			if(((Temperature-SetTemperature)*1200)>6000)TIM_SetCompare2(TIM1,6000);
			else	TIM_SetCompare2(TIM1,(Temperature-SetTemperature)*1200); 	
			TIM_SetCompare1(TIM1,0); 			
			TIM_CCxCmd(TIM1,TIM_Channel_1,TIM_CCx_Disable);
			TIM_CCxCmd(TIM1,TIM_Channel_2,TIM_CCx_Enable);
			GPIO_SetBits(GPIOB, GPIO_Pin_13);
			GPIO_ResetBits(GPIOB, GPIO_Pin_14);
		}

猜你喜欢

转载自blog.csdn.net/gd1984812/article/details/105908177
今日推荐