OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3085|回复: 4

关于用GPIOA8和9输出PWM,0到7用于AD检测

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2015-7-17
在线时间
0 小时
发表于 2015-8-15 16:28:42 | 显示全部楼层 |阅读模式
5金钱

我编写了一个这个程序,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]

AD七路测量加显示程序.zip

6.52 MB, 下载次数: 29

最佳答案

查看完整内容[请看2#楼]

回复【4楼】lycreturn: --------------------------------- 我换了两个IO口这个问题解决了,可是把PWM和显示部分放在同一个while循环里面,PWM生成的速率降低了,这是什么原因啊
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2015-7-17
在线时间
0 小时
 楼主| 发表于 2015-8-15 16:28:43 | 显示全部楼层
回复【4楼】lycreturn:
---------------------------------
我换了两个IO口这个问题解决了,可是把PWM和显示部分放在同一个while循环里面,PWM生成的速率降低了,这是什么原因啊
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2015-7-17
在线时间
0 小时
 楼主| 发表于 2015-8-15 16:30:34 | 显示全部楼层
求解决,好急啊
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2015-7-17
在线时间
0 小时
 楼主| 发表于 2015-8-15 16:38:08 | 显示全部楼层
TIM_SetCompare2(TIM1,led0pwmval);
TIM_SetCompare3(TIM1,led0pwmval);


主函数里面应该是这个,但改了这个后还是不行
回复

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5781
金钱
5781
注册时间
2013-11-22
在线时间
1212 小时
发表于 2015-8-15 23:37:27 | 显示全部楼层
CH2 CH3 是PA9  A10吧    这2个IO一般用作串口通信了   你看看是不是这个原因
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-18 09:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表