OpenEdv-开源电子网

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

STM32 的PWM学习中的问题,怎么在一个周期内精确的改变两次电平

[复制链接]

26

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2015-12-7
在线时间
59 小时
发表于 2016-4-19 20:19:05 | 显示全部楼层 |阅读模式
50金钱

学的PWM, 原子·每次都只是控制一个周期中的一个转折点.  

如果我想让它产生两个准确的转折点 大概像个凹字,该怎么办. 我试过加个if(TIM8->CNT  < 1/4的PWM周期计数)诸如此类的蠢方法..

但是并没有什么卵用....     谁能指点个大概的方向...?或者实现的方法..

刚刚上面说的怕不清楚 给两个图,一个是现在实现的,一个是想实现的凹字PWM..



2.jpg
1.jpg

最佳答案

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

代码为mini板的 TIM3_CH3(PB0) ,初始化 TIM3_Int_Init(999,71);//1MHz频率计数 输出一个凹字形后关闭定时器 频率可以自己设定 [mw_shl_code=applescript,true]//通用定时器中断初始化 //这里时钟选择为APB1的2倍,而APB1为36M //arr:自动重装值。 //psc:时钟预分频数 //这里使用的是定时器3! void TIM3_Int_Init(u16 arr,u16 psc) { RCC->APB1ENR|=1ARR=arr; //设定计数器自动重装值 TIM3->PSC= ...
< 主啊,请你温柔的笑吧 >
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2165

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5759
金钱
5759
注册时间
2013-11-22
在线时间
1208 小时
发表于 2016-4-19 20:19:06 | 显示全部楼层
本帖最后由 lycreturn 于 2016-4-19 23:05 编辑

代码为mini板的 TIM3_CH3(PB0) ,初始化 TIM3_Int_Init(999,71);//1MHz频率计数
输出一个凹字形后关闭定时器  频率可以自己设定

[mw_shl_code=applescript,true]//通用定时器中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void TIM3_Int_Init(u16 arr,u16 psc)
{
        RCC->APB1ENR|=1<<1;        //TIM3时钟使能
        RCC->APB2ENR|=1<<3;         //GPIOB时钟使能
        
        GPIOB->CRL&=0XFFFFFFF0;        //PB0 1清除之前的设置 TIM3_CH3
        GPIOB->CRL|=0X0000000B;        //复用功能输出
        
         TIM3->ARR=arr;  //设定计数器自动重装值
        TIM3->PSC=psc;  //预分频器设置
        
        TIM3->CCMR2|=3<<4;//CH3 输出比较反转模式
        TIM3->CCER|=1<<8;//CH3 输出使能
        
        TIM3->DIER|=1<<3;   //允许CH3 比较中断                                       
  MY_NVIC_Init(1,3,TIM3_IRQn,2);//抢占1,子优先级3,组2        
        TIM3->SR=0;                //清除更新中断
        TIM3->CR1|=0x01;    //使能定时器3        
}
u8 times=0;
u16 ccr3val;
const u16 interval[4]={100,100,150,100};//重装值        根据需要自己设定
//定时器3中断服务程序         
void TIM3_IRQHandler(void)
{                                                                  
        if(TIM3->SR&(1<<3))//CH3 比较中断
        {
                TIM3->SR&=~(1<<3);//清除比较中断标志位        
                times++;               
                if(times==4)                        
                {
                        times=0;  
                        TIM3->CR1&=~(1<<0);//关闭计数器
                }
                ccr3val=TIM3->CCR3;
                TIM3->CCR3=ccr3val+interval[times];//更新重装值
        }                                                
}[/mw_shl_code]
回复

使用道具 举报

3

主题

2165

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5759
金钱
5759
注册时间
2013-11-22
在线时间
1208 小时
发表于 2016-4-19 22:59:41 | 显示全部楼层
用输出比较模式,设置几个比较值,然后反转电平就可以了,看着个图  凹不?

QQ截图20160419225755.png
回复

使用道具 举报

26

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2015-12-7
在线时间
59 小时
 楼主| 发表于 2016-4-22 05:23:51 | 显示全部楼层
lycreturn 发表于 2016-4-19 22:59
用输出比较模式,设置几个比较值,然后反转电平就可以了,看着个图  凹不?

嗯,我试了,也确实出来了.  但是我调成连续的时候就不对了-  -.中间总是有些奇怪的间隔,2333
< 主啊,请你温柔的笑吧 >
回复

使用道具 举报

0

主题

13

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
295
金钱
295
注册时间
2019-11-25
在线时间
67 小时
发表于 2022-6-30 11:22:47 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 19:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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