OpenEdv-开源电子网

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

PWM 怎麼控制上升/下降位置

[复制链接]

60

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2814
金钱
2814
注册时间
2012-10-17
在线时间
653 小时
发表于 2016-3-8 18:57:12 | 显示全部楼层 |阅读模式
10金钱
void TIM3_PWM_Init(void)
{
    GPIO_Set(GPIOB,PIN5,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);
    GPIO_AF_Set(GPIOB,5,2); //PB5 AF2 TIM3_CH2   
           
    TIM3->ARR=10;
    TIM3->CCR2=1;  
   
    TIM3->CR2 |= 5<<4;    //TRGO OC2REF
   
    TIM3->SMCR |= 1<<7; //slave mode
    TIM3->SMCR |= 1<<4; //TIM2 trigger
    TIM3->SMCR |= 7<<0; //TIM2 TRGO Rising edge count+   
   
    TIM3->CCMR1|= 3<<12; //CNT==CCR2, OC2 output evert   
   
    TIM3->CCER |= 1<<4;  //enable OC2
    TIM3->CCER |= 0<<5;  //OC2 polarity    high Level effective
            
    TIM3->DIER |= 1<<2;  //enable compare2 interrupt
   
    MY_NVIC_Init(1,3,TIM3_IRQn ,2);   
    TIM3->CR1 |= 1<<0;  
}


void TIM3_IRQHandler(void)
{   
    if(TIM3->CCR2==1)
    {
        TIM3->CCR2=8;   
    }
    else
    {
        TIM3->CCR2=1;
    }
   
    TIM3->SR &= ~(1<<2);  //clear Compare 2 interrupt flag
}

CLK由TIM2產生的
原本想產生第一個CLK上升 第8個CLK下降的PWM
結果連週期都錯的....應該是10個CLK 結果變20個  duty也錯的

是不是TIMx_CCMR1 OC1M:输出比较 1 模式 (Output compare 1 mode) 011:翻转––TIMx_CNT=TIMx_CCR1 时,OC1REF 发生翻转。
不能這樣玩阿...想說在中斷修改CCR讓它在別的地方翻轉就好....

有沒有大俠知道為啥~~

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

使用道具 举报

60

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2814
金钱
2814
注册时间
2012-10-17
在线时间
653 小时
 楼主| 发表于 2016-3-9 17:45:10 | 显示全部楼层
救命阿~~一堆怪怪問題...我的TIM2才 enable CC3I 然後 發現中斷都會連進2次

void TIM2_PWM_Init(u32 arr, u32 psc)
{
       
        RCC->APB1ENR|=7<<0; //enable TIM2 TIM3 TIM4 clk
        RCC->AHB1ENR|=1<<1; //enable PORTB clk
       
        GPIO_Set(GPIOB,PIN10,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);
        GPIO_AF_Set(GPIOB,10,1); //PB10 AF1 TIM2_CH3
       
        TIM2->CR2=2<<4; //UI TRGO
       
        TIM2->ARR = arr;       
        TIM2->PSC = psc;
        TIM2->CCR3= arr*0.5;  //D=0.5
       
        TIM2->CCMR2 |= 7<<4;  //PWM mode  CNT<CCR output=effective Level, CNT>CCR output=invalid Level
       
        TIM2->CCER  |= 1<<8;  //enable OC3 output
        TIM2->CCER  |= 0<<9;  //OC3 polarity        High Level effective
       
        TIM2->DIER         |= 1<<3;  //ebable CC3I       
       
        MY_NVIC_Init(1,3,TIM2_IRQn ,2);
       
}

void TIM2_IRQHandler(void)
{
       
        PCout(7)=~PCout(7);  <===看示波器都在TIMCH3的上升沿之後 連續反轉2次
        TIM2->SR = 0;  //clear
}
回复

使用道具 举报

60

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2814
金钱
2814
注册时间
2012-10-17
在线时间
653 小时
 楼主| 发表于 2016-3-9 18:01:28 | 显示全部楼层
        if(TIM2->SR&1<<3)
        {
                PCout(7)=~PCout(7);
                TIM2->SR = ~(1<<3);  //clear CC3I
        }

這樣寫就正常...好奇怪阿~~~~~
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2016-3-9 22:21:05 | 显示全部楼层
帮顶
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 07:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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