极客云X 发表于 2018-1-7 19:43:51

STM8S003F3P6 控制电脑4PIN风扇 PWM

读取电位器电压,然后调整占空比




#include "stm8s.h"
#include "stm8s_gpio.h"

#define PWM_F640

uint8_t HexTable[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
uint16_t CCR1_Val = 100;

void DelayApi(uint16_t uwDelayCnt);
void TIM2_Config(void);

void Init_UART1(void)
{
      UART1_DeInit();
      UART1_Init((u32)9600, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TX_ENABLE);
//      UART1_Cmd(ENABLE);
}
void Send(uint8_t dat)
{
    while(( UART1_GetFlagStatus(UART1_FLAG_TXE)==RESET));
      
    UART1_SendData8(dat);
      
}
void Init_ADC(void)
{
      //GPIO_Init(GPIOD, GPIO_PIN_2, GPIO_MODE_IN_FL_NO_IT);
      ADC1_DeInit();
      ADC1_Init(ADC1_CONVERSIONMODE_SINGLE, ADC1_CHANNEL_3, ADC1_PRESSEL_FCPU_D2, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL3, ENABLE);
      ADC1_Cmd(ENABLE);
}
void UART1_sendhex(unsigned char dat)
{
    Send('0');
               
    Send('x');
               
    Send(HexTable);
               
    Send(HexTable);
               
    Send(' ');
}
void UART1_sendstr(unsigned char *dat)
{
    while(*dat!='\0')
               
    {
                              
      Send(*dat);
                              
      dat++;
      //delay2us();
               
    }
}
void main(void)
{
    //FlagStatus flag_status;
    u16 u16_adc1_value;
    //Init_UART1();
    Init_ADC();
   
    CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//16/1=16MHZ
    GPIO_DeInit(GPIOD);
    GPIO_Init(GPIOD,GPIO_PIN_2,GPIO_MODE_IN_PU_NO_IT);
    //GPIO_DeInit(GPIOD);
    GPIO_Init(GPIOD,GPIO_PIN_4,GPIO_MODE_OUT_PP_HIGH_SLOW);
   
    TIM2_Config();
    TIM2_SetCompare1(CCR1_Val);
/* Infinite loop */
    while (1)
    {
                //Send(0xf0);
         ADC1_StartConversion();
         //flag_status = ADC1_GetFlagStatus(ADC1_FLAG_EOC);
      // while(flag_status == RESET); // SET or RESET
         while(RESET == ADC1_GetFlagStatus(ADC1_FLAG_EOC));
             u16_adc1_value = ADC1_GetConversionValue();
         //CCR1_Val=u16_adc1_value*2/3-66;
         //CCR1_Val=101+u16_adc1_value*10/19;
         /*if(u16_adc1_value<180)
         {
            CCR1_Val=70+u16_adc1_value*2;
         }else
         {
          CCR1_Val=460+(u16_adc1_value-180)*10/47;
         }
         */
          if(u16_adc1_value<180)
          {
            if(u16_adc1_value<100){u16_adc1_value=100;}
            CCR1_Val=u16_adc1_value+((u16_adc1_value-100)*36/10);
          }else
          {
            CCR1_Val=460+(u16_adc1_value-180)*10/47;
          }
         
         if(CCR1_Val>30000)
         CCR1_Val=0;
         if(CCR1_Val>PWM_F && CCR1_Val<2000)
         CCR1_Val=PWM_F-2;
          TIM2_SetCompare1(CCR1_Val);
         //UART1_sendhex((u16_adc1_value>>8));
         //UART1_sendhex((u16_adc1_value&0xff));
         //UART1_sendstr("\r\n");
         
         //GPIO_WriteReverse(GPIOB,GPIO_PIN_5);
         
}

}

void TIM2_Config(void)
{

TIM2_TimeBaseInit(TIM2_PRESCALER_1, PWM_F);

TIM2_OC1Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE,CCR1_Val, TIM2_OCPOLARITY_HIGH);
TIM2_OC1PreloadConfig(ENABLE);

//TIM2_OC2Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE,CCR2_Val, TIM2_OCPOLARITY_HIGH);
//TIM2_OC2PreloadConfig(ENABLE);
         
//TIM2_OC3Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE,CCR3_Val, TIM2_OCPOLARITY_HIGH);
//TIM2_OC3PreloadConfig(ENABLE);
TIM2_ARRPreloadConfig(ENABLE);

TIM2_Cmd(ENABLE);
}

void DelayApi(uint16_t uwDelayCnt)
{
while(uwDelayCnt--);
}

#ifdef USE_FULL_ASSERT

/**
* @briefReports the name of the source file and the source line number
*   where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval : None
*/
void assert_failed(u8* file, u32 line)
{
/* User can add his own implementation to report the file name and line number,
   ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

/* Infinite loop */
while (1)
{
}
}
#endif

程序打包下载(IAR):
链接:https://pan.baidu.com/s/1i5aShzn 密码:t8rc
页: [1]
查看完整版本: STM8S003F3P6 控制电脑4PIN风扇 PWM