历史上的今天
返回首页

历史上的今天

今天是:2024年09月04日(星期三)

正在发生

2020年09月04日 | 提高stm32f103c8t6的PWM精度

2020-09-04 来源:eefocus

刚从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毫伏。

推荐阅读

史海拾趣

Galaxy ( Bel )公司的发展小趣事

风华邦科(FH-BK)公司发展的五个故事

故事一:技术创新引领发展

风华邦科自成立以来,便致力于技术创新与研发。公司于2019年引进了当时国内先进的一体成型电感生产设备,实现了全流程生产线,生产效率显著提升。此后,公司继续加大技术投入,2021年更是引进了5条全自动生产线,日均产量达到100万个电感器。这些技术革新不仅提高了生产效率,还确保了产品的高精度和高可靠性,使风华邦科在电子元器件细分市场上占据了领先地位。

故事二:国际化布局与专利突破

风华邦科在科技创新的道路上不断前行,不仅在国内市场取得显著成绩,还积极向国际市场拓展。公司注重知识产权的全球布局,已获得多项国外授权发明专利,包括在韩国和日本获得的关于掺杂钙钛矿锡酸钡材料及其制备方法的专利。这些国际专利的获得,标志着风华邦科在高端材料研发方面取得了重要突破,也为公司进一步开拓国际市场奠定了坚实基础。

故事三:产学研合作推动产业升级

风华邦科深知,单凭自身力量难以实现跨越式发展。因此,公司积极与高校及科研机构开展产学研合作,共同攻克技术难题。近年来,公司与清华大学、华中科技大学等高校开展了多项科研课题,涉及电子元器件的新材料、新工艺等多个领域。这些合作不仅提升了公司的技术研发能力,还促进了科技成果的转化与应用,推动了公司的产业升级与转型。

故事四:军品配套与质量管理

风华邦科在军用电子元器件领域也取得了显著成绩。公司始终坚持“安邦兴国、科技领先”的企业宗旨,不断加强技术创新和质量管理工作。公司通过了多项军工质量管理体系认证和保密资格认证,并列入总装备部《军用电子元器件科研生产单位目录》。公司现拥有七条完整的产品生产线,能够为用户提供电子元器件的一站式采购服务,产品广泛应用于航天、航空、船舶等军工领域。

故事五:环保生产与社会责任

在快速发展的同时,风华邦科始终不忘履行社会责任。公司积极响应国家环保政策,践行绿色生产理念。通过引入现代化自动化生产线、制定双碳实施方案、推广绿色工艺新技术等措施,公司有效降低了生产过程中的能耗和碳排放量。此外,公司还积极参与社会公益活动,为地方经济发展和社会进步贡献了自己的力量。这些举措不仅提升了公司的社会形象,也为其可持续发展奠定了坚实基础。

AMERICASEMI [America Semiconductor, LLC]公司的发展小趣事

AMERICASEMI深知产品质量对于企业发展的重要性。因此,公司建立了严格的质量管理体系,从原材料采购到生产制造的每一个环节都进行严格把控。同时,AMERICASEMI还注重品牌建设,通过参加国际电子展会、发布技术论文等方式提升品牌知名度和影响力。这些努力使得AMERICASEMI在半导体行业中树立了良好的口碑和形象。

DETCO公司的发展小趣事

为了进一步拓展全球市场,ElectronicsCorp制定了国际化战略。公司先后在北美、欧洲和南美等地设立了研发中心和生产基地。这些海外机构不仅为ElectronicsCorp提供了更广阔的市场空间,还使其能够更深入地了解不同地区的消费者需求和文化背景。通过本土化战略的实施,ElectronicsCorp逐渐在海外市场取得了成功。

BURGESS公司的发展小趣事

BURGESS公司于1975年3月13日在伦敦正式成立,这标志着它在游艇经纪行业的起点。创立之初,BURGESS就凭借其专业的知识和敏锐的市场洞察力,在短短四年内成功进驻摩纳哥这一游艇行业的重镇。更令人瞩目的是,在同一年,BURGESS成功售出了当时世界上最大的游艇,这一成就不仅彰显了其卓越的实力,也为其在行业内赢得了极高的声誉。

Gould Fiber Optics公司的发展小趣事
可能是滤波电容老化、稳压电路故障或负载变化大。
ASM公司的发展小趣事

近年来,随着全球半导体市场的竞争加剧和技术的不断更新换代,ASM公司也面临着巨大的挑战。为了保持竞争优势,公司不断调整其战略和业务结构,加大研发力度,推出更具竞争力的新产品。同时,公司还积极寻求与其他企业的合作与共赢,共同推动半导体产业的发展。

问答坊 | AI 解惑

TFT液晶显示原理

本帖最后由 jameswangsynnex 于 2015-3-3 20:00 编辑 [;)][ip]TFT液晶显示原理TFT型的液晶显示器较为复杂,主要的构成包括了,萤光管、导光板、偏光板、滤光板、玻璃基板、配向膜、液晶材料、薄模式晶体管等等。首先液晶显示器必须先利用背光源, ...…

查看全部问答>

=[分享]-FSC仙童小信号二三极管选用手册=

仙童小信号二三极管选用手册,不错的东东,有需要的来下哦。…

查看全部问答>

现在新出了一种单片机来替代AT89C51,它们最大的区别在哪?

现在单片机让人眼花缭乱的,究竟哪种性价比较好?…

查看全部问答>

未来中国安防市场IP产品的增长成为热点

IMSResearch最近发布了一份名为《中国安防产业IP趋势》的研究,目的是希望了解IP相关技术如何在安防领域应用以及发展前景等问题。该研究针对中国本土提供电子物理安防产品的系统集成商和工程商,根据他们对IP安防产品的经验,对市场进行了分析。这 ...…

查看全部问答>

malloc频繁申请大内存会导致异常吗

我在程序中 { ...... malloc 400K字节的缓冲区   ...... free ~ } 请问如果频繁的反复以上操作会导致异常或者死机吗 我的程序 疯狂进行30次会出现异常  不知道是不是这个原因引起的…

查看全部问答>

200分求助 有用过SQLCE的吗? 会的请进.

我就是想用VS2005做一个小程序 在PDA上运行. 能用RDA方式操作SQL2000里的表就行. 原来用SQLite库了.但是中文乱码 那里我处理不好.所以,改回用SQLCE. 请用过的朋友教一下. 分没问题. 可以另开帖.... 我的QQ:49440483…

查看全部问答>

别扭的1640

这两天,板子焊好了,一点一点在翻阅此前做的各种笔记,想起当时没太仔细考虑 充电程式的问题。   于是开始想MAX1640充电程式的设置问题。   做一个高质量点的 锂电池充电器 自然希望能实现典型的三段式充电程式CCCV。 然而,在这方 ...…

查看全部问答>

请教版主关于VBAT后备电池的问题。急

现象描述 1、板子焊接好后安装上电池3v(纽扣电池),非充电的。 2、用万用表量量电池电压 3v没问题,但VBAT端电压则只有1点多v 3、将目标板上电(没有下载任何程序),再断电,则VBAT端电压正常。 4、试验我n多板子,结论同上。 5、不安 ...…

查看全部问答>

怎么测量大的交流信号微小的幅值变化

目前做一谐振电路,通过调节电感,来改变信号幅值,但现在想把这个幅值测出来,不知道哪位大虾能帮忙下!…

查看全部问答>