OpenEdv-开源电子网

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

关于战舰板与自己做的C8T6核心板PWM输出问题,高手回答

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-9-23
在线时间
2 小时
发表于 2016-1-1 14:29:48 | 显示全部楼层 |阅读模式
5金钱
RT
     

  事情是这样的我在战舰板的程序是使用定时器4通道4,也就是PB9口来输出PWM,使用示波器来显示波型,是一个很漂亮的PWM,周期50HZ,成功地控制舵机,一直都没有问题。但是我使用自己做得C8T6核心板(核心板可用)PB9口来输出PWM波,跟战舰板同样配置I/O口,参数一样,但是驱动不了舵机,用示波器测试,竟然是漂亮的正弦波。下面有关于问题的详细描述,希望高手回答,弄了几天了,头大了。









下面关于问题详细描述:




下面的代码我战舰板的配置PWM(可用)
void TIM4_PWM_Init(u16 arr,u16 psc)
{  
        GPIO_InitTypeDef GPIO_InitStructure;//GPIO结构体
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;//基本定时器的结构体
        TIM_OCInitTypeDef  TIM_OCInitStructure;//通道结构体的设置
        

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);        //使能定时器2时钟
         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟

   //设置该引脚为复用输出功能,输出TIM4 CH4的PWM脉冲波形        GPIOB.9
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO

   //初始化TIM4
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
        
        //初始化TIM4 Channel4 PWM模式         
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性高
        TIM_OC4Init(TIM4, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM4 OC4

        TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);  //使能TIM4在CCR4上的预装载寄存器

        TIM_Cmd(TIM4, ENABLE);  //使能TIM4
        TIM_CtrlPWMOutputs(TIM4, ENABLE);


}

void main()  //部分主函数,大家看看主要部分吧
{
   PWM_Init(199,7199);
   while(1)
  {
       TIM_SetCompare4(TIM4,10);
       delay_ms(1000);
       TIM_SetCompare4(TIM4,20);
       delay_ms(1000);
       printf("ok");
}


同样这样的程序:但是用于自己的C8T6核心板,但是改了驱动文件,改成md中容量的了,然后再把STM32F10X_HD,USE_STDPERIPH_DRIVER  改成STM32F10X_MD,USE_STDPERIPH_DRIVER  还有把驱动文件改成了C8T6的。就是这样但是输出来的波形很乱啊。如果这样可能因为核心板可能因为核心板不能用对吧。但是核心板是能用的。
因为我有个朋友的程序用在了核心板能用,看看朋友的程序吧:


void PWM_Init(u16 arr,u16 psc)//这里我只用到PB9  TIM4通道4的I/O口。
{   
        
        /********** TIM4_CH1 -- CH4   PWM 配置  ***********/
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        TIM_OCInitTypeDef TIM_OCInitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
        
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);        //使能定时器1时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
        
                //设置该引脚为复用输出功能,输出TIM4 CH1~CH4  的PWM脉冲波形        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7| GPIO_Pin_8 | GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
        
  //初始化TIM4
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

        //初始化TIM4 Channel2 PWM模式         
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
        TIM_OC1Init(TIM4, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM4 OC1
        TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);  //使能TIM4在CCR1上的预装载寄存器
        
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
        TIM_OC2Init(TIM4, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM4 OC2
        TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);  //使能TIM4在CCR2上的预装载寄存器
        
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
        TIM_OC3Init(TIM4, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM4 OC3
        TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);  //使能TIM4在CCR2上的预装载寄存器
        
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
        TIM_OC4Init(TIM4, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM4 OC4
        TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);  //使能TIM4在CCR2上的预装载寄存器
        
        
        TIM_Cmd(TIM4, ENABLE);  //使能TIM4
        TIM_CtrlPWMOutputs(TIM4, ENABLE);
        
                /********** TIM2_CH4   PWM 配置  ***********/


        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);        //使能定时器2时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
            

        GPIO_PinRemapConfig(GPIO_PartialRemap2_TIM2  , ENABLE);
        //设置该引脚为复用输出功能,输出TIM4 CH1的PWM脉冲波形        GPIOB.11
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //TIM4_CH1
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO



        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

        //初始化TIM4 Channel2 PWM模式         
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
        TIM_OC4Init(TIM2, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM4 OC1
        TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);  //使能TIM4在CCR1上的预装载寄存器
        TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);  //使能TIM4在CCR1上的预装载寄存器

        TIM_Cmd(TIM2, ENABLE);  //使能TIM4
        TIM_CtrlPWMOutputs(TIM2, ENABLE);
}
int main(void)
{         
        int i;
        LED_Init();
        delay_init();
        uart_init(115200);
        PWM_Init(199,7199);

        while(1)
        {
        //        LED1 = ~LED1;
        //        delay_ms(100);
         // PWM_Control(USART1_RX_BUF);
                TIM_SetCompare4(TIM4,10);
                delay_ms(1000);
                TIM_SetCompare4(TIM4,20);
                delay_ms(1000);
                printf("ok");
        }
}


不过我朋友学习时候用的是野**的吧,他习惯用MDK4。而我用原子战舰,习惯用MDK5(这个应该没有影响啊。)但是朋友的程序就是能用。我对过了好多次程序发现根本没有什么不同。

我怀疑是不是战舰板的程序要移至C8T6需要改一点东西,而我没改了。。希望各位高手来分析一下问题。。。。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-9-23
在线时间
2 小时
 楼主| 发表于 2016-1-1 14:33:42 | 显示全部楼层
补充一点就是,我朋友的驱动部分复制到我的工程里面还是,然后编译下载到我的C8T6的核心板还是不行。
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2016-1-1 22:29:09 | 显示全部楼层
1.先建一个C8T6的工程,能够正确输出PWM再进一步移植
2.新手必看的提示都提示那么清楚了,连发两个帖子都带着,也是够了
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5781
金钱
5781
注册时间
2013-11-22
在线时间
1212 小时
发表于 2016-1-1 22:49:13 | 显示全部楼层
配置定时器用的 TIM4_PWM_Init  main函数初始化 调用的 PWM_Init,  检查下是不是这个问题
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 04:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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