我编写了一个这个程序,AD正常,PWM不正常,求解决
[mw_shl_code=c,true]int main(void)
{
u16 adcx0,adcx1,adcx2,adcx3,adcx4,adcx5,adcx6;
float temp0,temp1,temp2,temp3,temp4,temp5,temp6;
u16 led0pwmval=0;
u8 dir=1;
delay_init(); //???±??????????
//LED_Init(); //????????LED??????????????
TIM1_PWM_Init(899,0);//??·?????PWM????=72000/(899+1)=80Khz
SystemInit();
delay_init1(72); //???±??????
NVIC_Configuration();
uart_init(9600);
LCD_Init(); //PE.ALL,PD1~5
Adc_Init(); //PA0~3
POINT_COLOR=BLUE;//?è??×?????????
LCD_ShowString(60,20,200,16,16,"ADC_CH0_VAL:");
LCD_ShowString(60,40,200,16,16,"ADC_CH0_VOL:0.000V");
LCD_ShowString(60,60,200,16,16,"ADC_CH1_VAL:");
LCD_ShowString(60,80,200,16,16,"ADC_CH1_VOL:0.000V");
LCD_ShowString(60,100,200,16,16,"ADC_CH2_VAL:");
LCD_ShowString(60,120,200,16,16,"ADC_CH2_VOL:0.000V");
LCD_ShowString(60,140,200,16,16,"ADC_CH3_VAL:");
LCD_ShowString(60,160,200,16,16,"ADC_CH3_VOL:0.000V");
LCD_ShowString(60,180,200,16,16,"ADC_CH4_VAL:");
LCD_ShowString(60,200,200,16,16,"ADC_CH4_VOL:0.000V");
LCD_ShowString(60,220,200,16,16,"ADC_CH5_VAL:");
LCD_ShowString(60,240,200,16,16,"ADC_CH5_VOL:0.000V");
LCD_ShowString(60,260,200,16,16,"ADC_CH6_VAL:");
LCD_ShowString(60,280,200,16,16,"ADC_CH6_VOL:0.000V"); while(1)
{
/////?????·???ù???ò///////////////////////
delay_ms(10);
if(dir)led0pwmval++;
else led0pwmval--;
if(led0pwmval>300)dir=0;
if(led0pwmval==0)dir=1;
TIM_SetCompare2(TIM2,led0pwmval);
TIM_SetCompare3(TIM2,led0pwmval);
adcx0=Get_Adc(ADC_Channel_0);//ADC_Channel_x=ADC_INx,0~4096
LCD_ShowNum(156,20,adcx0,4,16);//????ADC????
temp0=(float)adcx0*(3.3/4096);
adcx0=temp0;
LCD_ShowNum(156,40,adcx0,1,16);//??????????
temp0-=adcx0;
temp0*=1000;
LCD_ShowNum(172,40,temp0,3,16);
// LED0=!LED0;
///////?????·???ù???ò//////////////////////////////////////////////
adcx1=Get_Adc(ADC_Channel_1); //ADC_Channel_x=ADC_INx,0~4096
LCD_ShowNum(156,60,adcx1,4,16);//????ADC????
temp1=(float)adcx1*(3.3/4096);
adcx1=temp1;
LCD_ShowNum(156,80,adcx1,1,16);//??????????
temp1-=adcx1;
temp1*=1000;
LCD_ShowNum(172,80,temp1,3,16);
///////?????·???ù???ò//////////////////////////////////////////////
adcx2=Get_Adc(ADC_Channel_2); //ADC_Channel_x=ADC_INx,0~4096
LCD_ShowNum(156,100,adcx2,4,16);//????ADC????
temp2=(float)adcx2*(3.3/4096);
adcx2=temp2;
LCD_ShowNum(156,120,adcx2,1,16);//??????????
temp2-=adcx2;
temp2*=1000;
LCD_ShowNum(172,120,temp2,3,16);
///////?????·???ù???ò//////////////////////////////////////////////
adcx3=Get_Adc(ADC_Channel_3); //ADC_Channel_x=ADC_INx,0~4096
LCD_ShowNum(156,140,adcx3,4,16);//????ADC????
temp3=(float)adcx3*(3.3/4096);
adcx3=temp3;
LCD_ShowNum(156,160,adcx3,1,16);//??????????
temp3-=adcx3;
temp3*=1000;
LCD_ShowNum(172,160,temp3,3,16);
///////?????·???ù???ò//////////////////////////////////////////////
adcx4=Get_Adc(ADC_Channel_4); //ADC_Channel_x=ADC_INx,0~4096
LCD_ShowNum(156,180,adcx4,4,16);//????ADC????
temp4=(float)adcx4*(3.3/4096);
adcx4=temp4;
LCD_ShowNum(156,200,adcx4,1,16);//??????????
temp4-=adcx4;
temp4*=1000;
LCD_ShowNum(172,200,temp4,3,16);
///////???ù?·???ù???ò//////////////////////////////////////////////
adcx5=Get_Adc(ADC_Channel_5); //ADC_Channel_x=ADC_INx,0~4096
LCD_ShowNum(156,220,adcx5,4,16);//????ADC????
temp5=(float)adcx5*(3.3/4096);
adcx5=temp5;
LCD_ShowNum(156,240,adcx5,1,16);//??????????
temp5-=adcx5;
temp5*=1000;
LCD_ShowNum(172,240,temp5,3,16);
///////?????·???ù???ò//////////////////////////////////////////////
adcx6=Get_Adc(ADC_Channel_6); //ADC_Channel_x=ADC_INx,0~4096
LCD_ShowNum(156,260,adcx6,4,16);//????ADC????
temp6=(float)adcx6*(3.3/4096);
adcx6=temp6;
LCD_ShowNum(156,280,adcx6,1,16);//??????????
temp6-=adcx6;
temp6*=1000;
LCD_ShowNum(172,280,temp6,3,16);
}
}
void Adc_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1 , ENABLE ); //????ADC1?¨???±??
//RCC_APB2Periph_GPIOx,x=GPIOx
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //AD???ù?±??72M/6=12M,????????14M??·??ò????????
//PA0--ADC_IN0 PA1--ADC_IN1 PA2--ADC_IN2 PA3--ADC_IN3 PA4--ADC_IN4 PA5--ADC_IN5 PA6--ADC_IN6 PA7--ADC_IN7
//PB0--ADC_IN8 PB1--ADC_IN9 PC0--ADC_IN10 PC1--ADC_IN11 PC2--ADC_IN12 PC3--ADC_IN13 PC4--ADC_IN14 PC5--ADC_IN15
//PA0~3 4?·×÷???????¨??????????
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //??????????????
GPIO_Init(GPIOA, &GPIO_InitStructure); //x=GPIOx
//------------------------------------ADC?è??--------------------------------------------------------
ADC_DeInit(ADC1); //?????è ADC1???????????÷???è???±????
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC?¤×÷????:ADC1??ADC2?¤×÷??????????
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //????×????¤×÷?????¨??????
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //????×????¤×÷??????×???????
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //×??????í??????????????·?????
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC??????????
ADC_InitStructure.ADC_NbrOfChannel = 1; //???ò???????ò×?????ADC?¨????????????????1???¨??
ADC_Init(ADC1, &ADC_InitStructure); //?ù??ADC_InitStruct?????¨???????????????èADCx???????÷
ADC_Cmd(ADC1, ENABLE); //???????¨??ADC1
ADC_ResetCalibration(ADC1); //???????¨??ADC1????×??????÷
while(ADC_GetResetCalibrationStatus(ADC1)); //????ADC1??????×??????÷??×???,?±????×??????÷?è???ê??
ADC_StartCalibration(ADC1); //???????¨ADC1????×?×???
while(ADC_GetCalibrationStatus(ADC1)); //???????¨ADC1????×????ò,?±????×??ê??
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //???????¨??ADC1???í??×???????????
}
//????ADC??
//ch:?¨???? 0~3
u16 Get_Adc(u8 ch)
{ unsigned int result=0;
unsigned char i;
//?è?????¨ADC?????ò×é?¨?????è???ü????×??????ò?????ù?±??
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC?¨??ch,???ò???ù???ò???ò????1,???ù?±????239.5????
for(i=0;i<8;i++)
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //???????¨??ADC1???í??×???????????
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//????×????á??
result+=ADC_GetConversionValue(ADC1);
}
result=result/8; //??8?????ù?????ù??
return result; //·??????ù??
}
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);//
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO , ENABLE); //????GPIO???è?±??????
//?è??????????????????????,????TIM1 CH1??PWM?????¨??
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9; //TIM_CH1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //???????ì????
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = arr; //?è???????????ü??????×°????????×?????×°???????÷???????? 80K
TIM_TimeBaseStructure.TIM_Prescaler =psc; //?è??????×÷??TIMx?±?????????????¤·????? ??·???
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //?è???±??·???:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM?ò??????????
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //?ù??TIM_TimeBaseInitStruct?????¨????????????TIMx???±???ù??????
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //?????¨?±?÷????:TIM?????í???÷??????2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±???????????
TIM_OCInitStructure.TIM_Pulse = 0; //?è????×°??????±????????÷????????
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //????????:TIM????±?????????
TIM_OC1Init(TIM1, &TIM_OCInitStructure); //?ù??TIM_OCInitStruct?????¨???????????????èTIMx
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //?????¨?±?÷????:TIM?????í???÷??????2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±???????????
TIM_OCInitStructure.TIM_Pulse = 0; //?è????×°??????±????????÷????????
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //????????:TIM????±?????????
TIM_OC2Init(TIM1, &TIM_OCInitStructure); //?ù??TIM_OCInitStruct?????¨???????????????èTIMx
TIM_CtrlPWMOutputs(TIM1,ENABLE); //MOE ?÷????????
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //CH1?¤×°??????
TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable); //CH1?¤×°??????
TIM_ARRPreloadConfig(TIM1, ENABLE); //????TIMx??ARR?????¤×°???????÷
TIM_Cmd(TIM1, ENABLE); //????TIM1
}
[/mw_shl_code]
|