新手入门
- 积分
- 10
- 金钱
- 10
- 注册时间
- 2016-11-22
- 在线时间
- 0 小时
|
#include "stm32f10x.h"
#include "stm32f10x_adc.h"
#include "stm32f10x_tim.h"
extern void delay_ms(u16 nms);
extern void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
void TIM1_PWM_Init(u16 arr,u16 psc);
//3õê¼»ˉ ADC
//ĬèÏ¿aÆôí¨μà0-3
void Adc_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|
RCC_APB2Periph_ADC1 ,ENABLE); //ê1ÄüADC1í¨μàê±Öó
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //éèÖÃADC·ÖÆμòò×ó6
//72M/6=12ADC ×î′óê±¼ä2»Äü3¬1y14M
//PA1 ×÷ÎaÄ£Äaí¨μàêäèëòy½Å
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN; //Ä£Äaêäèë
GPIO_Init(GPIOA,&GPIO_InitStructure); //3õê¼»ˉGPIOA.1
ADC_DeInit(ADC1); // ¸′λADC1£¬½«íaéèADC1μÄè«2¿¼Ä′æÆ÷ÖØéèÎaĬèÏÖμ
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//ADC¶àá¢Ä£ê½
ADC_InitStructure.ADC_ScanConvMode=DISABLE; //μ¥í¨μàÄ£ê½
ADC_InitStructure.ADC_ContinuousConvMode=DISABLE; //μ¥′Î×a»»Ä£ê½
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None; //×a»»óéèí¼tÆô¶ˉ¶ø2»êÇía2¿′¥·¢
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right; //ADCêy¾Yóò¶ÔÆë
ADC_InitStructure.ADC_NbrOfChannel=1; //Ë3Dò½øDD1æÔò×a»»μÄADCí¨μàêyÄ¿
ADC_Init(ADC1,&ADC_InitStructure); //¸ù¾YÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèADC X
ADC_Cmd(ADC1,ENABLE); //ê1ÄüÖ¸¶¨ADC1
ADC_ResetCalibration(ADC1); //¿aÆô¸′λD£×¼
while(ADC_GetResetCalibrationStatus(ADC1)); //μè′y¸′λD£×¼½áêø
ADC_StartCalibration(ADC1); //¿aÆôADD£×¼
while(ADC_GetCalibrationStatus(ADC1)); //μè′yD£×¼½áêø
}
//»ñμÃADCÖμ
//chí¨μàÖμ0~3
u16 Get_Adc(u8 ch)
{
//éèÖÃADC1æÔò×éí¨μ££¬éèÖÃËüÃÇμÄ×a»ˉË3Dòoí2éÑùê±¼ä
ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_239Cycles5);
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));
return ADC_GetConversionValue(ADC1);//
}
u16 Get_Adc_Average(u8 ch,u8 times)
{
u32 temp_val=0;
u8 t;
for(t=0;t<times;t++)
{
temp_val+=Get_Adc(ch);
delay_ms(5);
}
return temp_val/times;
}
u16 hhh(float temp)
{
float zzz[14] = {2.5, 2, 1.5, 1.25, 1, 0.8, 0.7,
0.6, 0.56, 0.52, 0.51, 0.5, 0.49, 0.47};
u16 kkk[14]={20, 30, 40, 50, 60, 70, 80, 90, 100,
110, 120, 130, 140, 150};
u16 count;
for(count=0;count<13;count++)
{
if(zzz[count]<=temp)
return kkk[count];
}
return kkk[13];
}
int main(void)
{
u16 adcx;
u16 x;
u16 v;
float temp;
Adc_Init();
TIM1_PWM_Init(899, 0);
while(1)
{
adcx=Get_Adc_Average(ADC_Channel_1,10);
temp=(float)adcx*(3.3/4096);
adcx=temp;
x = hhh(temp);
v = (-9*x+1120)/13;
if(v>100)
v = 100;
else if(v<10)
v = 10;
TIM_SetCompare1(TIM1, 655*v);
}
}
//PWMêä3ö3õê¼
//arr: ×Ô¶ˉ×°ÔØÖμ
//psc:ê±ÖóÔ¤·ÖÆμêy
void TIM1_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);//1ê1Äütim1ê±Öó
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//1ê1ÄüGPIOíaéèê±Öóê1Äü
//éèÖøÃòy½ÅÎa¸′óÃêä3ö1|Äü£¬êä3öTIM1 CH1μÄ WMÂö3å2¨DÎ
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;//TIM_CH1
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//¸′óÃíÆíìêä3ö
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period =arr;
//éèÖÃÔúÏÂò»¸ö¸üDÂê¼t×°èë»î¶ˉμÄ×Ô¶ˉÖØ×°ÔØ¼Ä′æÆ÷ÖüÆúμÄÖμ 80K
TIM_TimeBaseStructure.TIM_Prescaler=psc;
//
TIM_TimeBaseStructure.TIM_ClockDivision=0;//
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);//
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;//
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//
TIM_OCInitStructure.TIM_Pulse=0;//
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//
TIM_OC1Init(TIM1,&TIM_OCInitStructure);//
TIM_CtrlPWMOutputs(TIM1,ENABLE);//
TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);//
TIM_ARRPreloadConfig(TIM1,ENABLE);//
}
|
|