刚从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毫伏。
上一篇:STM8-SO8-DISCO之建立IAR模板及第一个工程转灯
下一篇:STM8 EEPROM心得
推荐阅读最新更新时间:2024-10-30 11:44
设计资源 培训 开发板 精华推荐
- 用于通信/电信的 2.7 至 12V 差分放大器
- AL1696EV2,基于 AL1696 高亮度升降压 LED 驱动器的评估板
- REF191 精密微功耗、低压差电压基准的典型应用
- VIN = 12V、VOUT = 5V、3A 时 ADP2302 降压稳压器的典型应用
- LTC3772EDDB 演示板,550kHz 降压型 DC/DC 转换器,VIN = 2.75V-8V,VOUT = 1.8V @ 2A
- 使用 MaxLinear, Inc 的 SPX2951 的参考设计
- 评估M0-7 VIPower产品盒
- LTC1666 的典型应用 - 12 位 50Msps DAC
- CY8C5888AXQ-LP096 CY8C58LP PSoC 5LP 可编程片上系统的典型应用
- 使用 Analog Devices 的 AD9144BCPZ 的参考设计
- 4月26日上午10:00邀您观看 基于TI Sitara™AM5708的工业派开源平台介绍 有奖直播
- 可配置处理器技术入门
- 【有奖直播】:Microchip ATmega4809系列单片机简介
- 有奖直播 | 瑞萨新一代视觉 AI MPU 处理器 RZ/V2H:高算力、低功耗、实时控制
- 大联大有奖直播:科技之眼-思特威图像传感器的新视界
- 是德科技有奖直播:元宇宙测试系列研讨会之VR/AR 数字接口测试的挑战
- 以科技先行,传感新未来 下载艾迈斯半导体 《高精度短距离测量方案 》答题赢好礼!
- 有奖直播 | 是德科技 InfiniiMax4.0系列高带宽示波器探头新品发布
- ADI 生命体征监测技术:对人体实施状态监控,答题有好礼
- 邀请小伙伴一起学AM437x,好礼有你!