切换到宽版
  • 5193阅读
  • 23回复

[STM]新年大礼包:ARDUINO  STM8   发布: (一) 安装 [复制链接]

上一主题 下一主题
离线水云居士

发帖
61
M币
625
专家
1
粉丝
4
只看该作者 20楼 发表于: 03-12
我用arduino测试PWM,安装教程设置频率,用led观察亮度变化,发现led亮度没有按线性变化,设置10k频率还出现led闪动现象,很显然,频率设置没有起作用,线性也有问题,我找到以前keil做的PWM,再测试线性很好,也没有闪动现象,对于arduino不是很了解,不知道怎么设置才会正常!用的核心板是stm32f103c8t6和stm32f030f3p6测试!
离线huaweiwx

发帖
1273
M币
3361
专家
57
粉丝
240
只看该作者 21楼 发表于: 03-15
回 水云居士 的帖子
水云居士:我用arduino测试PWM,安装教程设置频率,用led观察亮度变化,发现led亮度没有按线性变化,设置10k频率还出现led闪动现象,很显然,频率设置没有起作用,线性也有问题,我找到以前keil做的PWM,再测试线性很好,也没有闪动现象,对于arduino不是很了解,不知道怎么设置才会正常!用 .. (2018-03-12 20:18) 回 水云居士 的帖子

在 stm32  arduino 中的模拟量输出的实现中通常有以下几种方法:

1 使用pwm 这是通用的标准用法,对应有时钟(TIMx)通道的引脚输出pwm信号,优点是简单,缺点是仅限于有对应有时钟(TIMx)通道的引脚,才有这个功能,没有时钟输出功能的脚就没有模拟输出,在arduino官方板上就是限定了标有Ax编号的模拟输出脚;另外,由于要防止其它应用也用到对应的TIMx资源,程序要做这方面的检查,增加了系统的复杂性或限制(尤其是对stm32这样复杂的芯片和有大量复用的情形),增加限制意味着降低了应有的灵活性,缺少限制就无法防止资源的冲突;

2 使用DAC,优点非常明显,输出直流,精确稳定;缺点是DAC只有有限的几个脚有这样的输出功能;arduino 把这功能留给了用户自己实现;

3 仅使用 一个指定的定时器,在任何一个引脚上输出一个模拟PWM的信号;这就是我这一版采用的方案,优点是只使用一个定时器就可以在任何一个脚上输出模拟量,因为很多非标准板子通常会找个功能最弱的脚来做个led或控制TFT的背光,如用硬件pwm,这个led或背光由于没有timx的功能,就没法通过pwm来调亮度,而采用模拟pwm,则可实现这个功能;这个版本使用的是TIM3(没有时用TIM2),其他高级定时器都向用户开放,另外如确实想用硬件pwm,采用一个库方案 HardwareTimer(arduino1805\hardware\arm\HALMX\libraries\HardwareTimer),在这个库中实现了大部分定时器的功能;可以参考该库的例子来了解库提供的全部功能;当然这个方案的缺点也是明显的,模拟pwm要占用更多的mcu运行时间,而且精度差一点,因为还有其他更高级的中断会影响其输出响应,而且频率和精度不宜设置过高,因为中断服务程序比硬件pwm处理时间多;


离线水云居士

发帖
61
M币
625
专家
1
粉丝
4
只看该作者 22楼 发表于: 03-27
STM8确实摸不透,在别的核心正常的代码,在STM8却不行!





int j = 1000;
float f;
void setup() {
  //Serial1.begin(115200);
}
void loop() {

  float d = j / 7;
  //先计算后转换,结果是整数
  f = float (j) / 7;
  //先转换再计算,结果是浮点数,

  Serial1.print (d, 5);
  Serial1.print ("          ");//
  Serial1.println (f, 5);
  delay (1000);
}

就那个示例正常!
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
离线huaweiwx

发帖
1273
M币
3361
专家
57
粉丝
240
只看该作者 23楼 发表于: 03-29
回 水云居士 的帖子
水云居士:STM8确实摸不透,在别的核心正常的代码,在STM8却不行!
[图片]
....... (2018-03-27 20:48) 回 水云居士 的帖子

stm8 使用的是 sdcc ,不支持 c++;因此 所有Serial.xxxx 函数在stm8 sduino中改为:
Serial_xxxx_/s/i/sn/d/f 对应输出不同类型。对应你的程序,需要改为:

int j = 1000;
float f;
void setup() {
  Serial_begin(115200);
}
void loop() {

  float d = j / 7.0;   //7  改成 7.0是必须的,因为让c 按浮点数计算;
  //先计算后转换,结果是整数
  f = float (j) / 7;    //7  不需要改成 7.0,因为float (j) 是浮点数,表达式按浮点计算;
  //先转换再计算,结果是浮点数,

  Serial_print_f(d, 5); //d 是浮点
  Serial_print_s("          ");//输出串
  Serial_println_f(f, 5);//f 是浮点
  delay (1000);
}


[ 此帖被huaweiwx在2018-03-30 20:24重新编辑 ]