微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 代码:利用STM32将一串ASCII码转变成周期固定占空比不同PWM波

代码:利用STM32将一串ASCII码转变成周期固定占空比不同PWM波

时间:10-02 整理:3721RD 点击:

能不能利用STM32将一串ASCII码转变成周期固定,占空比不一样的PWM波?跪求代码

直接将字符转为数字,例如word-'0'就可以直接转化为数字。

发送“MN”对应的二进制是“10011011001110“ 怎样将这个序列变成两个占空比不一样的方波?

使用定时器中断,在定时器中断里通过判断ASCII码值,来改变CCRx的大小

能帮忙写两句吗

小编 需要哪部分?

应该用PWM模式还是比较输出模式?是不是应该把TIM_OCInitStructure.TIM_Pulse设为变量?怎样定义这个变量?应该在哪定义?应该设置哪些中断,输出通道配置和中断函数能写下吗?谢谢您~

你好,我的看法如下:
1.根据工程要求,我觉得使用PWM模式就行,stm32参考手册上对该模式的的定义是:“脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。
2.TIM_OCInitStructure.TIM_Pulse 是设置跳变值用的,当计数器计数到这个值时,电平发生跳变  ,你可以先给它一个初始值,然后通过在TIMx中断函数里改变TIMx_CCRx的值来改变它。
3.我贴一段该模式的代码,供你参考:
/****************************************************************************
* 名    称: TIM3_PWM_Config
* 功    能:配置TIM3输出的 PWM 信号的模式,如周期、极性、占空比  
* 入口参数:无
* 出口参数:无
* 说    明:
* 调用方法:无
****************************************************************************/
void TIM3_PWM_Config()
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef        TIM_OCInitStructure; //        结构体
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//打开TIM3时钟
    TIM_TimeBaseStructure.TIM_Prescaler = 36-1;   //设置预分频;1MHz
    TIM_TimeBaseStructure.TIM_Period = 40000-1;      //PWM周期         
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;        //设置时钟分频系数:不分频
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数模式
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);          //使用TIM3

           /* PWM1 Mode configuration: Ch1 */
        TIM_OCInitStructure.TIM_OCMode                         = TIM_OCMode_PWM1;        //配置为PWM模式1
        TIM_OCInitStructure.TIM_OutputState         = TIM_OutputState_Enable;
        //设置跳变值,当计数器计数到这个值时,电平发生跳变   
        TIM_OCInitStructure.TIM_Pulse                         = 1600;            
        //当定时器计数值小于CCR1_Val时为高电平        
        TIM_OCInitStructure.TIM_OCPolarity                 = TIM_OCPolarity_High;
        TIM_OC1Init(TIM3, &TIM_OCInitStructure);
        TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);

    TIM_ClearFlag(TIM3,TIM_FLAG_CC1);    //清除定时器中断标志   
    TIM_ITConfig(TIM3,TIM_IT_CC1,ENABLE); //使能中断
        //使能 TIM3定时器
        TIM_Cmd(TIM3, ENABLE);        
}

void TIM3_IRQHandler()
{
        static int i=0;
       
        //溢出中断
        if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)
        {
                TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);
                if(i<500) {i++;TIM3->CCR1=2000}
                if(i>=500)
                {
                TIM3->CCR1=4000;       
                }       
       
       
        }       
}

这个是用来输出一通道前期占空比为 2000/40000的脉冲波,过20s后输出占空比为10%的脉冲波
类似的,你可以将ASCII码值通过switch函数对应不同的TIMx_CCRx的值,从而输出不同波形,代码具体实现,还是自己写比较好。
4.本人水平有限,如有错误和疏忽,请指正。

不好意思啊,我似乎原理不太懂,TIM_OCInitStructure.TIM_Pulse = 1600;这句为什么要设为1600,不应该是2000吗?这样输出占空比才是2000/40000.

比方我发送A,串口1接收后,PWM产生占空比为4%的方波,这些语句应该在main函数里写,还是在哪写?您帮忙看看这是怎么回事


TIM_OCInitStructure.TIM_Pulse = 1600;设置为1600,只是因为我随便给的初始值,占空比50%是通过中断服务函数中这句: if(i<500) {i++;TIM3->CCR1=2000}来实现的,TIM_Pulse   是TIM_OCInitStructure这个结构体中的变量,TIMx_CCRx是计数寄存器的值,这两者都可以改变占空比,只是改变TIM_Pulse麻烦,每次都要声明一个结构体,然后将数据写入;CCRx则不同,它是寄存器,操作起来很方便,就跟51一样,直接对寄存器赋值。


我觉得你用串口接收数据,就在串口中断服务函数里面CCRx的值,从而改变占空比,我没试过,所以不敢保证能行,你试试看

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

网站地图

Top