中级会员
- 积分
- 251
- 金钱
- 251
- 注册时间
- 2020-2-17
- 在线时间
- 133 小时
|
void TIM2_PWM_Init(uint16_t f)
{
uint32_t period,perscaler;
double timefloat0,timefloat1=0,timefloat_old;
double temp=0,temp2;
int i,j,k;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
//f=1000;
timefloat0=1000000.0f/f;
timefloat_old=100;
for(i=0;i<65535;i++)
{
temp2=(double)(72*timefloat0)/(i+1);
if(temp2<65535)
{
if(temp2-(int)temp2!=0)
{
temp2-=1;
for(j=temp2;j<65535;j++)
{
timefloat1=(double)((j+1)*(i+1))/72.0f;
temp=timefloat0-10;
if(timefloat1>timefloat0)break;
temp=__fabs(timefloat1-timefloat0);
if(temp<timefloat_old)
{
period=j;perscaler=i;
LCD_ShowxNum(100,160,period,6,16,0);
LCD_ShowxNum(100,180,perscaler,6,16,0);
timefloat_old=temp;
if(timefloat_old==0)break;
}
}
}else
{
period=(int)temp2;perscaler=i;
break;
}
}
}
/* 开启时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
/* 配置GPIO的模式和IO口 */
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
GPIO_Init(GPIOA,&GPIO_InitStructure);
TIM_TimeBaseInitStructure.TIM_Period=period; //自动装载值
TIM_TimeBaseInitStructure.TIM_Prescaler=perscaler; //分频系数
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
TIM_OCInitStructure.TIM_Pulse=period/2;
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OC2Init(TIM2,&TIM_OCInitStructure); //输出比较通道1初始化
TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable); //使能TIMx在 CCR1 上的预装载寄存器
TIM_OC3Init(TIM2,&TIM_OCInitStructure); //输出比较通道3初始化
TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_Enable); //使能TIMx在 CCR1 上的预装载寄存器
TIM_ARRPreloadConfig(TIM2,ENABLE);//使能预装载寄存器
//TIM_CCxCmd(TIM2, TIM_Channel_2, TIM_CCx_Enable);
TIM_Cmd(TIM2,ENABLE); //使能定时器
}
//第一次分享,写法算法低级,别见笑,不知有没有更好的算法,目前这个10K时误差只有1.06HZ,(示波器)
|
|