提高stm32f103c8t6的PWM精度

发布者:平安宁静最新更新时间:2020-09-04 来源: eefocus关键字:stm32f103c8t6  PWM精度  模拟值 手机看文章 扫描二维码
随时随地手机看文章

刚从51转过来,不想投入太多的资金,选择某宝的小蓝板(bluePill),这个板可能是最便宜的了(7.6元包邮)。初步测试一下时钟,定时器,中断,DMA什么的。到ADC还比较满意,DAC就晕了(这个芯片没有DAC)。于是采用PWM出模拟值。先初始化;

void TIM1_PWM_Init(u16 arr,u16 psc)
{  
        GPIO_InitTypeDef GPIO_InitStructure;                              
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);     //
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);  //使能GPIO外设时钟使能

   //设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM_CH1         //PA8是PWM输出
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;            //复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
   //定时器初始化       
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
   //初始化输出比较参数
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitStructure.TIM_Pulse = 1350; //设置待装入捕获比较寄存器的脉冲值 1350--Low  200--High
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性高
        TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
          //使能预装载寄存器
  TIM_CtrlPWMOutputs(TIM1,ENABLE);            //MOE 主输出使能。该函数操作的是TIM1 刹车和死区寄存器该函数并不是适合所有定时器的,
                                        //只有部分定时器可以使用,例如,在stm32f0中,可用于TIM1, TIM15, TIM16以及TIM17,
                                        //在stm32f1中可用于TIM1, TIM8,TIM15, TIM16以及TIM17,如果在其它定时器中使用,
                                        //可能会使STM32停留在某一处而无法继续执行下面的任务
        TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);  //CH1预装载使能         
  TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器
        TIM_Cmd(TIM1,ENABLE);  //使能TIM1

}



然后在MAIN()中:
int main()
{
TIM_SetCompare1(TIM1,1500);  //占空比=1000 / (2999+1)*100% = 50%
while(1)
{
   ;
}
}
可以在PA8看到PWM波形。一顿操作:

发现DAC输出精度,线性都不好。也不知道是运放的问题还是其他。网上一顿搂,改进PWM输出模拟量。

效果好了不少。线性还是不好。
于是将DAC又返回ADC采集加数字闭环。
dac_d是期望输出的值,dac_out是送去PWM转换的值,vi是从DACOUT那里取出的电压ADC值。下面程序是数字反馈
void dac_auto(void)
{
        u16 tmp;
       if((short int)vi>(dac_d+1))
            {
                tmp=(short int)vi-dac_d;
                if(tmp>=220)dac_out-=170;
                else if(tmp>=100)dac_out-=80;
                else if(tmp>=50)dac_out-=45;
                else if(tmp>=10)dac_out-=6;
                else if(tmp>=5)dac_out-=2;
                else dac_out-=1;
             }
        else if((short int)vi<(dac_d-1))
            {
                tmp=dac_d-(short int)vi;
                if(tmp>=220)dac_out+=110;
                else if(tmp>=100)dac_out+=55;
                else if(tmp>=50)dac_out+=35;
                else if(tmp>=10)dac_out+=7;
                else if(tmp>=5)dac_out+=3;
                else dac_out+=1;
            }
                if(dac_out>=2999)dac_out=2999;
                if(dac_out<=1)dac_out=1;
                TIM_SetCompare1(TIM1,dac_out);
        filter();
}

经过处理,PWM输出的最终电压值波动小于1毫伏。

关键字:stm32f103c8t6  PWM精度  模拟值 引用地址:提高stm32f103c8t6的PWM精度

上一篇:STM8-SO8-DISCO之建立IAR模板及第一个工程转灯
下一篇:STM8 EEPROM心得

推荐阅读最新更新时间:2024-10-30 11:44

西门子PLC模拟量输入模块时接收到变动很大的不稳定的
可能的原因如下: 1.可能模拟量输入模块和现场传感器分别使用了自供电或隔离的电源,而两个电源没有彼此连接,即模拟量输入模块的电源和现场传感器的信号地没有连接;这将会产生一个很高的上下振动的共模电压,影响模拟量输入值。 2.另一个原因可能是模拟量输入模块接线太长或绝缘不好受到电磁干扰。 可以用如下方法解决: 1.连接现场传感器的负端与模块上的公共M端以补偿此波动。(但要注意,确保这是两个电源系统之间的唯一联系。) 背景是: 模拟量输入模块内部是非隔离的; 共模电压必须小于12V且大于-12V; 对于60Hz干扰信号的共模抑制比为40dB。 2.使用模拟量输入滤波。 点击“设备视图”,选择需要设置模拟量输入滤波的模块;如图 1 所示:
[嵌入式]
西门子PLC<font color='red'>模拟</font>量输入模块时接收到变动很大的不稳定的<font color='red'>值</font>?
基于STM32F103C8T6的心率血压手表设计
设计要求 随着社会的不断发展,生活水平越来越好,大家也越来越关注健康问题。 计步器是一种便携式反映人体状况的仪器,通过计算行走的步数和所消耗的能量,很有效反映人体健康的状态,所以受到了很多人的喜爱和欢迎。 总体设计方案 当传感器监测到数据之后,在屏幕上以曲线加数字的方式显示出检测者的血氧和心率数据。同时LED指示灯和蜂鸣器根据心率数据闪烁和发出声音。 如果未监测到数据,蜂鸣器常响警报。 硬件组成 主控芯片使用的是大家用的最多的MCU——STM32F103C8T6,ARM Cortex-M 内核32位,程序存储器容量是64KB,内部还集成了模数转换器A/D 10*12b。 测量传感器使用的是MAX30100,能够读取心率、血氧的
[单片机]
基于<font color='red'>STM32F103C8T6</font>的心率血压手表设计
精度三相PWM波形产生器SA4828在逆变器中的应用
    摘要: SA4828是Mitel公司生产的三相PWM波开产生器,它可提供高质量,全数字的三相脉宽调制波形,而且编程简单方便,修改灵活,文中介绍SA4828的原理及其应用在逆变器中的软、硬件设计方法。     关键词: 脉宽调制(PWM)  控制  逆变  SA4828 1 引言     脉宽调制(PWM)控制技术在逆变电路中得到广泛的应用,其波形产生方法有两种:一是模拟方法,二是数字方法。模拟方法电路结构复杂,有温漂现象,难以实现精确控制。数字方法则克服了上述缺点。MITEL公司生产的SA系统PWM波形产生器具有精度高、抗干扰能力强、外围电路简单等优点,其中SA4828是主要用于变频调速、逆变电源及
[应用]
一种嵌入式语音识别模块的设计与实现
服务机器人以服务为目的,因此人们需要一种更方便、更自然、更加人性化的方式与机器人交互,而不再满足于复杂的键盘和按钮操作。基于听觉的人机交互是该领域的一个重要发展方向。目前主流的语音识别技术是基于统计模式。然而,由于统计模型训练算法复杂,运算量大,一般由工控机、PC机或笔记本来完成,这无疑限制了它的运用。嵌入式语音交互已成为目前研究的热门课题。   嵌入式语音识别系统和PC机的语音识别系统相比,虽然其运算速度和内存容量有一定限制,但它具有体积小、功耗低、可靠性高、投入小、安装灵活等优点,特别适用于智能家居、机器人及消费电子等领域。   1 模块整体方案及架构   语音识别的基本原理如图1所示。语音识别包括两个阶段:训练和识
[单片机]
一种嵌入式语音识别模块的设计与实现
一种keil5锁死STM32F103C8T6的解决方法
先前画的一款电机驱动板,今天总算有时间调试了,,,效果如上,实验室里面的洗板水用没了。。。。没有办法收拾的干净了,LED 没了。。。 接线端子开关也没了。。。条件很艰苦 进入正题,上图主控是STM32F103C8T6就是网上卖的最便宜的那种。出现的问题时keil下载不进去程序。提示是这样玩的 我先用j-link自带的工具j-flash进行了测试确定了芯片是可以通讯并且可以进行hex文件的烧录的。这样定位问题应该是keil 的配置出了问题。 keil也不是一直出问题。某一次 也是可以下载的。经过多次尝试,我发现当我用j-flash擦除芯片 并且解锁unsecure芯片之后keil可以正常的下载程序。 然后就开始
[单片机]
一种keil5锁死<font color='red'>STM32F103C8T6</font>的解决方法
Stm32f103c8t6工程模板(内部晶振)源码
虽说内部晶振相对外部晶振误差较大,但是在大部分情况下不需要太高的精确度,使用内部晶振就可以搞定。 单片机源程序如下: #include config.h Sys_timeTypeDef Systime={0,0,0,0}; u8 once=0; void Init_Systick(void) //滴答定时器 { SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); SysTick_Config(SystemCoreClock / 1000); } void SYS_Init(void) { NVIC_PriorityGro
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved