集成两路MAX1169的STC8G1K08模块,带有两路PWM输出
■ 设计背景
在 集成有MAX1169,MAX520的DAAC单片STC8G1K08机电路板 中设计了集成有MAX1169的ADDA模块,对于一些需要使用PWM驱动的实验,这款模块还无法进行集成实验。
设计集成有两路MAX1169以及PWM输出的测试模块可以为很多实验提供测量和驱动功能。
比如:
01电路模块设计
1.电路设计1
▲ SCH原理图设计
▲ PCB电路板和快速制版PCB的实验模块
- 实验接口:(从右往左定义1,2,3,4~8)
PIN1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|
+5V | GND | AIN | AIN1 | AGND | PWM1 | IO | GND |
2.单片机软件设计2
- OSC工作频率:35MHz, UART:460800bps
设置STC8G1K08的关于I2C以及PACKAGE_SOP8 的共定义。
#define PACKAGE_SOP8 1
#define USSD_EN 0
#define I2C_EN 1
#define SPI_EN 0
- 1
- 2
- 3
- 4
(1) 软件说明
CCP2: 是PWM Channel3
(2) 串行命令
else IFARG0("maxstcpwm") {
sscanf(SDA(1), "%d", &nNumber);
PWM3SetPWM(0x3ff - nNumber);
} else IFARG0("maxstcread") {
printf("%u %u\r\n", MAX1169Read(), MAX1169Read1());
} else IFARG0("maxstcreadb") {
nNumber = MAX1169Read();
SendChar((unsigned char)(nNumber >> 8));
SendChar(nNumber);
nNumber = MAX1169Read1();
SendChar((unsigned char)(nNumber >> 8));
SendChar(nNumber);
} else IFARG0("maxstcon") {
ON(IO_PIN);
} else IFARG0("maxstcoff") {
OFF(IO_PIN);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
02电路测试
1.PWM输出
- 输出管脚: 3
- PWM 频率:34.17kHz(示波器实测)
单片机工作频率: f o s c = 35 × 1 0 6 f_{osc} = 35 \times 10^6 fosc=35×106Hz,PWM的位数:10位。
理论上计算PWM频率为:
f P W M = f o s c 2 10 = 35 × 1 0 6 1024 = 34.18 k H z f_{PWM} = {{f_{osc} } \over {2^{10} }} = {{35 \times 10^6 } \over {1024}} = 34.18kHz fPWM=210fosc=102435×106=34.18kHz
设置命令: maxstcpwm n
◎ 调试说明:
在STC8G1K08等单片机中,对于CCAP0H的赋值必须紧接着XCAP0H的赋值,所以对于其中的PWM1SetPWM函数需要进行修改:
//------------------------------------------------------------------------------
#if PWM_CHANNEL1_EN
void PWM1SetPWM(unsigned int nPWM) {
#if PWM1_BIT == 10
unsigned char ucPWM, ucPCA;
ucPWM = (unsigned char)(nPWM >> 4);
ucPWM &= 0x30;
ucPCA = PCA_PWM0
ucPCA &= 0xcf;
ucPCA |= ucPWM;
PCA_PWM0 = ucPCA;
#endif // PWM1_BIT
CCAP0H = (unsigned char)(nPWM & 0xff);
// CCAP0H:Must be assign value after XCAP0H
// is valued.
}
#endif // PWM_CHANNEL1_EN
//------------------------------------------------------------------------------
#if PWM_CHANNEL2_EN
void PWM2SetPWM(unsigned int nPWM) {
#if PWM2_BIT == 10
unsigned char ucPWM, ucPCA;
ucPWM = (unsigned char)(nPWM >> 4);
ucPWM &= 0x30;
ucPCA = PCA_PWM0
ucPCA &= 0xcf;
ucPCA |= ucPWM;
PCA_PWM1 = ucPCA;
#endif // PWM2_BIT
CCAP1H = (unsigned char)(nPWM & 0xff);
}
#endif // PWM_CHANNEL2_EN
//------------------------------------------------------------------------------
#if PWM_CHANNEL3_EN
void PWM3SetPWM(unsigned int nPWM) {
#if PWM3_BIT == 10
unsigned char ucPWM, ucPCA;
ucPWM = (unsigned char)(nPWM >> 4);
ucPWM &= 0x30;
ucPCA = PCA_PWM2;
ucPCA &= 0xcf;
ucPCA |= ucPWM;
PCA_PWM2 = ucPCA;
#endif // PWM3_BIT
CCAP2H = (unsigned char)(nPWM & 0xff);
}
#endif // PWM_CHANNEL3_EN
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
2.IO输出
- 输出管脚:2
设置命令:maxstcon, maxstcoff
3. 两路AD
- 对应管脚:PIN5,PIN6
左边对应的: AD2
右边对应的: AD1
03输入输出信号测试
1.对输出PWMRC滤波采集
▲ 对PWM输出RC滤波采集
2.对于IO口的RC波形采集
- R= 10k, C = 100uF
▲ 对于IO口的RC波形进行采集
使用scipy.optimize中的curve_fit函数对于上述采集数据进行指数拟合。
得到的参数为:[-6.71239337e+04 -9.76200318e-01 6.87801729e+04]
对应的表达式为:
y ( t ) = 6.878 × 1 0 4 − 6.712 × 1 0 4 × e − ( t × 0.976 ) y\left( t \right) = 6.878 \times 10^4 - 6.712 \times 10^4 \times e^{ - \left( {t \times 0.976} \right)} y(t)=6.878×104−6.712×104×e−(t×0.976)
其中的时间常数 τ = 0.976 s \tau = 0.976s τ=0.976s
这与 R ⋅ C = 1 s R \cdot C = 1s R⋅C=1s很接近了。
▲ 进行数据拟合
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST2.PY -- by Dr. ZhuoQing 2020-07-23
#
# Note:
#============================================================
from headm import *
from scipy.optimize import curve_fit
val = tspload('rcdata', 'val')
t = array(range(len(val))) * 0.01
def func(x, a, b, c):
return a * exp(x*b) + c
param = [-10000, -0.1, 60000]
param, conv = curve_fit(func, t, val, p0=param)
printf(param)
fitval = func(t, *param)
#------------------------------------------------------------
plt.plot(t, val, label='measure')
plt.plot(t, fitval, label='fit')
plt.xlabel("Time(s)")
plt.ylabel("Output")
plt.grid(True)
plt.legend(loc='upper right')
plt.tight_layout()
plt.show()
#------------------------------------------------------------
# END OF FILE : TEST2.PY
#============================================================
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
※ 结论
基于两颗MAX1169构成了两路的16bitAD转换模块。通过STM8G1K08-SOP8的CCP2输出PWM波形。PWM的频率为34kHz,分辨率为10bi。
在调试过程,修改了原来STC8G单片机中的PWMnSetPWM()中的函数。对于PWMn的赋值与PWM_CCP的赋值按照满足STC8G1K08数据手册中的一看球。
文章来源: zhuoqing.blog.csdn.net,作者:卓晴,版权归原作者所有,如需转载,请联系作者。
原文链接:zhuoqing.blog.csdn.net/article/details/107532306
- 点赞
- 收藏
- 关注作者
评论(0)