微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 怎么样用stm32产生占空比的矩形方波驱动

怎么样用stm32产生占空比的矩形方波驱动

时间:10-02 整理:3721RD 点击:
最近在做无线照明通信系统,用led发出的光把信号发送出去,现在想用stm32产生占空比根据输入信号变化的矩形方波驱动led,想请教下这个矩形方波怎样产生?TIM_OCInitStructure.TIM_Pulse 怎样和输入信号建立联系?[size=11.818181991577148px]请大牛们帮帮忙


直接就用PWM,或者定时器

用PWM或者用定时器来模拟。

直接就用PWM,或者定时器  恩我是想用PWM,比方发ABC,那么每个字母代表的CCRx的值不一样,怎样把他们建立联系?

你要想产生方波, 可以使用硬件PWM, 或者使用一个定时器,定时器到的时候GPIO置高电平,定时器再次到的时候,再置低电平, 一次看定时器到的次数,从而产生一个你需要的方波信号。
这个应该很好实现,就是用timer作为定时,产生一个自己想要的波形
用PWM,不同的字母有不同的占空比,,至于那个字母用什么占空比,自己定义,类似于密码,接收方要解码,就需要你的密码本

        while(1)
        {
                        delay_ms(100);
                if(dir)pwmval+=200;
                else pwmval-=200;
                if(pwmval>2000)dir=0;
                if(pwmval==200)dir=1;       
                                                                                                 
                TIM->CRR2=pwmval;}
void TIM3_PWM_Init(u16 arr,u16 psc)
{                                                          
        //此部分需手动修改IO口设置
RCC->APB1ENR|=1<<1;       //TIM3时钟使能   
        GPIOA->CRH&=0XFFFFFFF0;//PA8输出
        GPIOA->CRH|=0X00000004;//浮空输入
                 
        GPIOA->CRL&=0X0FFFFFFF;//PA7输出
        GPIOA->CRL|=0XB0000000;//复用功能输出           
        GPIOA->ODR|=1<<7;//PA7上拉       
        TIM3->ARR=arr;//设定计数器自动重装值
        TIM3->PSC=psc;//预分频器不分频
       
        TIM3->CCMR1|=7<<12;  //CH2 PWM2模式                 
        TIM3->CCMR1|=1<<11; //CH2预装载使能          
        TIM3->CCER|=1<<4;   //OC2 输出使能          
        TIM3->CR1=0x8000;   //ARPE使能
        TIM3->CR1|=0x01;    //使能定时器3                                                                                   
}           

        while(1)
        {
                        delay_ms(100);
                if(dir)pwmval+=200;
                else pwmval-=200;
                if(pwmval>2000)dir=0;
                if(pwmval==200)dir=1;       
                                                                                                 
                TIM->CRR2=pwmval;}
void TIM3_PWM_Init(u16 arr,u16 psc)
{                                                          
        //此部分需手动修改IO口设置
RCC->APB1ENR|=1<<1;       //TIM3时钟使能   
        GPIOA->CRH&=0XFFFFFFF0;//PA8输出
        GPIOA->CRH|=0X00000004;//浮空输入
                 
        GPIOA->CRL&=0X0FFFFFFF;//PA7输出
        GPIOA->CRL|=0XB0000000;//复用功能输出           
        GPIOA->ODR|=1<<7;//PA7上拉       
        TIM3->ARR=arr;//设定计数器自动重装值
        TIM3->PSC=psc;//预分频器不分频
       
        TIM3->CCMR1|=7<<12;  //CH2 PWM2模式                 
        TIM3->CCMR1|=1<<11; //CH2预装载使能          
        TIM3->CCER|=1<<4;   //OC2 输出使能          
        TIM3->CR1=0x8000;   //ARPE使能
        TIM3->CR1|=0x01;    //使能定时器3                                                                                   
}           

        while(1)
        {
                        delay_ms(100);
                if(dir)pwmval+=200;
                else pwmval-=200;
                if(pwmval>2000)dir=0;
                if(pwmval==200)dir=1;       
                                                                                                 
                TIM->CRR2=pwmval;}
void TIM3_PWM_Init(u16 arr,u16 psc)
{                                                          
        //此部分需手动修改IO口设置
RCC->APB1ENR|=1<<1;       //TIM3时钟使能   
        GPIOA->CRH&=0XFFFFFFF0;//PA8输出
        GPIOA->CRH|=0X00000004;//浮空输入
                 
        GPIOA->CRL&=0X0FFFFFFF;//PA7输出
        GPIOA->CRL|=0XB0000000;//复用功能输出           
        GPIOA->ODR|=1<<7;//PA7上拉       
        TIM3->ARR=arr;//设定计数器自动重装值
        TIM3->PSC=psc;//预分频器不分频
       
        TIM3->CCMR1|=7<<12;  //CH2 PWM2模式                 
        TIM3->CCMR1|=1<<11; //CH2预装载使能          
        TIM3->CCER|=1<<4;   //OC2 输出使能          
        TIM3->CR1=0x8000;   //ARPE使能
        TIM3->CR1|=0x01;    //使能定时器3                                                                                   
}           

stm32上不是有PWM(脉冲宽度调制器)。

用定时器就可以了,

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top