搜索
bottom↓
回复: 2

STM32 PWM输出遇到问题不解,求解决!

[复制链接]

出0入0汤圆

发表于 2015-2-4 09:14:35 | 显示全部楼层 |阅读模式
本帖最后由 ruan18278816371 于 2015-2-4 09:17 编辑

之前发过一贴没大侠回帖,今天换个板块发悬赏希望大侠们多多指教。用STM32F103R8T6配置了六路PWM输出,其中0 1 4 5这四路PWM任意一路都可以输出,唯独通道2和通道3不能输出,之前怀疑这两路可能是复用其他功能了,但是查了没有啊,刚上STM32看PWM底层驱动好晕,只会库函数开发,下面粘出代码,向大侠们求解!
/******************************************************************************
* 描述            : 启动PWM,这里默认系统时钟频率是 72MHz,如果不是,分频部分的代码需
* 描述            : 要修改
* 输入参数  : pwmRoad: 开启哪路Pwm, frequency:Pwm频率, dutyRatio:占空比
*******************************************************************************/
static void Start(int pwmRoad, int frequency, int dutyRatio)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        TIM_OCInitTypeDef TIM_OCInitStructure;      
   
    uint arr  = 0;
    uint psc  = 0;
    uint duty = 0;

    //这样分频的目的是获得更准确的频率
    if(frequency >= 1098)//当频率大于 1098Hz 时,不分频,直接用 arr 计数获取频率
    {
        psc = 0;
        arr = 72000000/frequency;
    }
    else if(frequency < 1098 && frequency >= 15)//当频率在 15Hz ~ 1098Hz 之间时,将频率降为 1 MHz
    {
        psc = 71;
        arr = 1000000/frequency;
    }
    else if(frequency < 15 && frequency >= 1)//当频率在 1Hz ~ 15Hz 之间时,将频率降为 100 KHz
    {
        psc = 719;
        arr = 100000/frequency;
    }

    duty = arr * dutyRatio / 100;            //计算占空比对应的比较值
    ArrBackup[pwmRoad] = arr;                //备份

    TIM_TimeBaseStructure.TIM_Period        = arr - 1; //设置在下一个更新事件装入活动的自动重装载寄存(TIMx_ARR)器周期的值.与PWM的f有关  72000/900=80K
    TIM_TimeBaseStructure.TIM_Prescaler     = psc - 1;  //设置用来作为TIMx时钟频率除数的预分频值    0x0不分频,这里分到的时钟频率为12 MHz
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;   //设置时钟分割:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode   = TIM_CounterMode_Up;    //TIM向上计数模式

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1

    if(pwmRoad < 2)                          //这样做的目的是为了不影响串口1                  
    {
        TIM_OCInitStructure.TIM_OutputState  = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_OCPolarity   = TIM_OCPolarity_High;
    }
    else
    {
        TIM_OCInitStructure.TIM_OutputState  = TIM_OutputState_Disable;
        TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;     
        TIM_OCInitStructure.TIM_OCNPolarity  = TIM_OCNPolarity_High;  
    }
    TIM_OCInitStructure.TIM_Pulse = duty;

    if(pwmRoad < 2)
    {
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
        TIM_Cmd(TIM3, ENABLE);
    }
    else
    {
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);  
        TIM_ARRPreloadConfig(TIM1, ENABLE);
        TIM_Cmd(TIM1, ENABLE);
        TIM_CtrlPWMOutputs(TIM1, ENABLE);
    }
   
    switch(pwmRoad)
    {
        case 0:
            TIM_OC3Init(TIM3, &TIM_OCInitStructure);                     
            TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
            break;
        case 1:
            TIM_OC4Init(TIM3, &TIM_OCInitStructure);
            TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);            
            break;  
        case 2:                                      //不能正常输出      
            TIM_OC3Init(TIM1, &TIM_OCInitStructure);      
            TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);
            break;
        case 3:                                    //不能正常输出      
            TIM_OC1Init(TIM1, &TIM_OCInitStructure); //TIM1
            TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);            
            break;            
        case 4:
            TIM_OC2Init(TIM1, &TIM_OCInitStructure);
            TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
            break;   
        case 5:   
            TIM_OC3Init(TIM1, &TIM_OCInitStructure);
            TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);
            break;
        default:
            break;
    }      
}

出0入0汤圆

发表于 2015-2-5 04:06:42 | 显示全部楼层
你2和5配置完全一样,不可能一个行另一个不行,部分代码没法找原因,上完整工程

出0入0汤圆

 楼主| 发表于 2015-2-5 09:29:32 | 显示全部楼层
小溪 发表于 2015-2-5 04:06
你2和5配置完全一样,不可能一个行另一个不行,部分代码没法找原因,上完整工程 ...

很抱歉,2和5一样是我测试发现不能输出PWM后修改过了的。现在上传整个工程,应该问题在PWM初始化函数void InitializePwm(void) 和PWM启动函数 void Start(int pwmRoad, int frequency, int dutyRatio)那里。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-30 00:10

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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