OpenEdv-开源电子网

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

两路PWM输出,但是为什么占空比设置一样输出的电压不一样,

[复制链接]

8

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
399
金钱
399
注册时间
2016-11-14
在线时间
51 小时
发表于 2017-3-22 14:19:58 | 显示全部楼层 |阅读模式
1金钱
我用的是TIM3的CH1和CH2两路PWM输出,占空比设置一样,输出的电压却不一样,CH1输出接近3.3V。CH2输出只有1.1V
PWM初始化:
#include "timer.h"
#include "led.h"


void TIM3_Int_Init(u16 arr,u16 psc)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //ê±Öóê1Äü

        TIM_TimeBaseStructure.TIM_Period = arr; //éèÖÃÔúÏÂò»¸ö¸üDÂê¼t×°èë»î¶ˉμÄ×Ô¶ˉÖØ×°ÔØ¼Ä′æÆ÷ÖüÆúμÄÖμ         ¼Æêyμ½5000Îa500ms
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //éèÖÃóÃà′×÷ÎaTIMxê±ÖóÆμÂê3yêyμÄÔ¤·ÖÆμÖμ  10KhzμļÆêyÆμÂê  
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //éèÖÃê±Öó·Ö¸î:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIMÏòéϼÆêyÄ£ê½
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //¸ù¾YTIM_TimeBaseInitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉTIMxμÄê±¼ä»ùêyμ¥λ

        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //ê1ÄüÖ¸¶¨μÄTIM3ÖD¶Ï,ÔêDí¸üDÂÖD¶Ï

        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3ÖD¶Ï
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //ÏèÕ¼óÅÏè¼¶0¼¶
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //′óóÅÏè¼¶3¼¶
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQí¨μà±»ê1Äü
        NVIC_Init(&NVIC_InitStructure);  //¸ù¾YNVIC_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèNVIC¼Ä′æÆ÷

        TIM_Cmd(TIM3, ENABLE);  //ê1ÄüTIMxíaéè
                                                         
}
//¶¨ê±Æ÷3ÖD¶Ï·tÎñ3ìDò
void TIM3_IRQHandler(void)   //TIM3ÖD¶Ï
{
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //¼ì2éÖ¸¶¨μÄTIMÖD¶Ï·¢éúóë·ñ:TIM ÖD¶ÏÔ′
                {
                TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //Çå3yTIMxμÄÖD¶Ï′y′|àíλ:TIM ÖD¶ÏÔ′
                LED1=!LED1;
                }
}



void TIM3_PWM_Init(u16 arr,u16 psc)
{
        TIM_OCInitTypeDef TIM_OCInitStruc;
        GPIO_InitTypeDef GPIO_InitStruc;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //ê±Öóê1Äü
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);

        GPIO_InitStruc.GPIO_Mode=GPIO_Mode_AF_PP;
        GPIO_InitStruc.GPIO_Pin=GPIO_Pin_5 | GPIO_Pin_4;
        GPIO_InitStruc.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStruc);
       
        GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);
       
        TIM_TimeBaseStructure.TIM_Period = arr; //éèÖÃÔúÏÂò»¸ö¸üDÂê¼t×°èë»î¶ˉμÄ×Ô¶ˉÖØ×°ÔØ¼Ä′æÆ÷ÖüÆúμÄÖμ         ¼Æêyμ½5000Îa500ms
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //éèÖÃóÃà′×÷ÎaTIMxê±ÖóÆμÂê3yêyμÄÔ¤·ÖÆμÖμ  10KhzμļÆêyÆμÂê  
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //éèÖÃê±Öó·Ö¸î:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIMÏòéϼÆêyÄ£ê½
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //¸ù¾YTIM_TimeBaseInitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉTIMxμÄê±¼ä»ùêyμ¥λ

        TIM_OCInitStruc.TIM_OCPolarity=TIM_OCPolarity_High;
        TIM_OCInitStruc.TIM_OCMode=TIM_OCMode_PWM2;
        TIM_OCInitStruc.TIM_OutputState=TIM_OutputState_Enable;
        TIM_OC2Init(TIM3,&TIM_OCInitStruc);
       
        TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);
        TIM_Cmd(TIM3, ENABLE);
}






主函数:
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "timer.h"

void qianjin(void);
void houtui(void);

int main(void)
{               
        delay_init();
        LED_Init();
        TIM3_PWM_Init(300-1,0);
        while(1)
        {
                GPIO_ResetBits(GPIOF,GPIO_Pin_4);
                GPIO_ResetBits(GPIOF,GPIO_Pin_5);
                qianjin();
                delay_ms(1000);
                houtui();
                delay_ms(1000);
        }
}

void qianjin()
{
        GPIO_SetBits(GPIOF,GPIO_Pin_1);
        GPIO_ResetBits(GPIOF,GPIO_Pin_0);
        TIM_SetCompare2(TIM3,200);               
       
        GPIO_SetBits(GPIOF,GPIO_Pin_3);
        GPIO_ResetBits(GPIOF,GPIO_Pin_2);
        TIM_SetCompare1(TIM3,200);
}

void houtui()
{
        GPIO_SetBits(GPIOF,GPIO_Pin_0);
        GPIO_ResetBits(GPIOF,GPIO_Pin_1);
        TIM_SetCompare2(TIM3, 200);               
       
        GPIO_SetBits(GPIOF,GPIO_Pin_2);
        GPIO_ResetBits(GPIOF,GPIO_Pin_3);
        TIM_SetCompare1(TIM3,200);
}[/mw_shl_code]1.1V


最佳答案

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

看到你有用到重映射TIM3 的CH1 CH2到PB4 PB5,因为PB4 是JTAG 调试接口,用作其他接口得先禁止掉JTAG;另外一点,你的PWM初始化,我只看到初始化CH2,CH1没有初始化 ,能用才怪呢
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5789
金钱
5789
注册时间
2013-11-22
在线时间
1214 小时
发表于 2017-3-22 14:19:59 | 显示全部楼层
看到你有用到重映射TIM3 的CH1 CH2到PB4 PB5,因为PB4 是JTAG 调试接口,用作其他接口得先禁止掉JTAG;另外一点,你的PWM初始化,我只看到初始化CH2,CH1没有初始化 ,能用才怪呢
回复

使用道具 举报

8

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
399
金钱
399
注册时间
2016-11-14
在线时间
51 小时
 楼主| 发表于 2017-3-22 19:22:10 | 显示全部楼层
lycreturn 发表于 2017-3-22 14:19
看到你有用到重映射TIM3 的CH1 CH2到PB4 PB5,因为PB4 是JTAG 调试接口,用作其他接口得先禁止掉JTAG;另外一 ...

谢谢大佬
回复

使用道具 举报

8

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
399
金钱
399
注册时间
2016-11-14
在线时间
51 小时
 楼主| 发表于 2017-3-25 14:11:30 | 显示全部楼层
lycreturn 发表于 2017-3-22 14:19
看到你有用到重映射TIM3 的CH1 CH2到PB4 PB5,因为PB4 是JTAG 调试接口,用作其他接口得先禁止掉JTAG;另外一 ...

为什么我禁止JTAG后,PB4输出变为为0V?
回复

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5789
金钱
5789
注册时间
2013-11-22
在线时间
1214 小时
发表于 2017-3-25 18:59:08 | 显示全部楼层
feng爸爸 发表于 2017-3-25 14:11
为什么我禁止JTAG后,PB4输出变为为0V?

CH1你是不是没配置  只配置了CH2?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-22 20:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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